C++类成员变量的储存

 首先我们来看一段代码:

class CTest
{
public:
int iCount;
};

类的成员变量的存储位置与该类实例(对象)的存储位置紧密相关。具体来说,成员变量会跟随对象存储在相同的内存区域。因此,对象在不同的内存区域,成员变量也会存储在相应的位置。

(1)栈(Stack):如果对象是在函数内部声明的,且没有通过 new 关键字进行动态分配,那么对象通常存储在栈上。栈上的对象会在其作用域结束时自动销毁。

#include <iostream>

class MyClass {
public:
    int memberVar;  // 成员变量
};

void createObjectOnStack() {
    MyClass obj;  // 对象在栈上创建
    obj.memberVar = 10;
    std::cout << "Object on stack, memberVar: " << obj.memberVar << std::endl;
}  // 函数结束,栈上对象 obj 自动销毁

int main() {
    createObjectOnStack();  // 调用函数
    return 0;
}

在MyClass 的实例 objcreateObjectOnStack() 函数内部声明,存储在栈上。成员变量 memberVar 也随对象一起存在栈中。当函数结束后,栈上的 obj 对象及其成员变量会自动销毁,不再占用内存。

(2)储存在堆:在类的成员变量存储中,堆(Heap)与栈(Stack)的对象存储方式不同。如果对象是通过 new 操作符进行动态分配的,那么该对象会被存储在堆上,且对象的成员变量也会跟随它一起存储在堆上。与栈上的对象不同,堆上的对象需要手动释放内存,使用 delete 来避免内存泄漏。

#include <iostream>

class MyClass {
public:
    int memberVar;  // 成员变量
};

void createObjectOnHeap() {
    MyClass* obj = new MyClass();  // 对象在堆上动态分配
    obj->memberVar = 20;
    std::cout << "Object on heap, memberVar: " << obj->memberVar << std::endl;
    delete obj;  // 手动释放堆上的对象,防止内存泄漏
}

int main() {
    createObjectOnHeap();  // 调用函数
    return 0;
}

由于堆上的对象不会自动销毁,因此我们需要手动使用 delete 来释放内存,否则会导致内存泄漏。

(3)在类的成员变量存储中,静态存储(Static Storage) 与全局变量有特殊的内存区域。如果一个对象是通过 static 关键字声明的,无论是在全局作用域还是局部作用域内,它都存储在静态存储区(Global/Static Area)。这种对象在其作用域内始终存在,并且直到程序结束时才会被销毁。

#include <iostream>

class MyClass {
public:
    int memberVar;  // 成员变量
};

// 全局对象
MyClass globalObj;  // 存储在全局/静态区

void function() {
    static MyClass obj;  // 存储在静态存储区
    obj.memberVar = 30;
    std::cout << "Static object in function, memberVar: " << obj.memberVar << std::endl;
}

int main() {
    globalObj.memberVar = 40;
    std::cout << "Global object, memberVar: " << globalObj.memberVar << std::endl;

    function();  // 调用函数,访问静态对象
    return 0;
}

全局对象:在程序启动时分配内存,存储在全局/静态存储区。即使不在函数内部,它的生命周期贯穿整个程序运行时间,直到程序结束。

静态局部对象:虽然声明在 function() 内部,但由于使用了 static 关键字,它存储在静态存储区,而不是栈上。即便函数退出,它也不会销毁,且状态会保持到下一次函数调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值