当使用 C++ 时, 如果有一个类:
class MyClass
{
char memory1bye;
int memory4bytes;
int another4bytes;
};
这个类在内存中总共使用了 9 个字节……所以如果我做类似的事情:
MyClass *t1;
这将为我提供该类的可用地址,但它会分配 9 个字节吗?它会调用默认构造函数吗? 或者我是否需要将这 9 个字节分配给类? 如果那时我调用了类似的东西:
t1 = (MyClass *)new MyClass;
会不会被认为是内存泄漏?换句话说,旧地址会怎样?
最佳答案
- 不要对数据类型的大小做出假设,它们取决于实现。
MyClass *t1
定义了一个未初始化的指针。取消引用它会调用 undefined behavior .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;
现在 t2
和 t1
指向同一个对象。完成对象后,只需执行以下操作:
delete t1;
(删除 t2
会产生相同的效果)。现在该对象已被销毁,但指针仍指向相同的地址(不再安全)。做
t2->doStuff();
在 delete
调用未定义的行为之后。如果我们回到删除之前,考虑一下:
t1 = NULL;
t2 = NULL;
现在我们没有我们创建的对象的地址了,所以我们不能对它调用delete
。这会造成内存泄漏。希望这能让您对正在发生的事情有所了解。现在忘掉这一切,阅读 RAII .
关于C++ 内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3715815/