C++ 内存分配

标签 c++ memory-management

当使用 C++ 时, 如果有一个类:

class MyClass
{
    char memory1bye;
    int memory4bytes;
    int another4bytes;
};

这个类在内存中总共使用了 9 个字节……所以如果我做类似的事情:

MyClass *t1;

这将为我提供该类的可用地址,但它会分配 9 个字节吗?它会调用默认构造函数吗? 或者我是否需要将这 9 个字节分配给类? 如果那时我调用了类似的东西:

t1 = (MyClass *)new MyClass;

会不会被认为是内存泄漏?换句话说,旧地址会怎样?

最佳答案

  1. 不要对数据类型的大小做出假设,它们取决于实现。
  2. MyClass *t1 定义了一个未初始化的指针。取消引用它会调用 undefined behavior .
  3. t1 = (MyClass *)new MyClass; 在堆上分配内存并创建一个新对象。如果未使用 delete 释放此内存,则会发生内存泄漏。此外,您不需要在那里进行强制转换,t1 = new MyClass(); 就足够了。

编辑:关于分配。

MyClass *t1 = NULL; 

声明一个指向 MyClass 对象的指针,但它并不创建该对象。此指针初始化为指向 0。现在当你这样做的时候

t1 = new MyClass();

new 运算符创建一个新的 MyClass 实例,并将该对象的地址分配给 t1。您现在可以通过 t1 使用该对象:

t1->doStuff();

您甚至可以创建更多指向同一对象的指针:

MyClass *t2 = t1;

现在 t2t1 指向同一个对象。完成对象后,只需执行以下操作:

delete t1;

(删除 t2 会产生相同的效果)。现在该对象已被销毁,但指针仍指向相同的地址(不再安全)。做

t2->doStuff();

delete 调用未定义的行为之后。如果我们回到删除之前,考虑一下:

t1 = NULL;
t2 = NULL;

现在我们没有我们创建的对象的地址了,所以我们不能对它调用delete。这会造成内存泄漏。希望这能让您对正在发生的事情有所了解。现在忘掉这一切,阅读 RAII .

关于C++ 内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3715815/

相关文章:

c++ - 16字节数据类型如何存储在64位机器上

java - 是否需要调用Lru Cache.evictAll();在 onDestroy() 方法中?

memory-management - 如何使用保留的CMA内存?

.net - 混合模式 C++/CLR 应用程序中的内存泄漏

c++ - 如何防止连续使用 'new' 分配失败时发生内存泄漏

if语句中的c++字符串比较

c++ - WinHttpOpenRequest 和无法到达的目标

ios - 使用 AFNetworking 获取图像时内存增长

memory-management - 堆栈/堆内存模型是可选的吗?

c++ - 库中的 Qt GUI?