与此问题并行:我何时应该在C++中使用new关键字?
假设我有以下代码结构:
class Foo{
private:
int a;
int b;
/* ect */
};
class Bar{
private:
Foo A;
/* ect */
};
int main() {
Bar *b;
b = new Bar();
// call b->methods()
delete b;
};
Run Code Online (Sandbox Code Playgroud)
我知道从上面的链接b是堆(免费存储)分配.但是A内部类的内容b呢?假设A堆分配是否安全?
"在堆上",讽刺的是,有点用词不当.C++没有规定堆的使用,只是new在未指定的"免费存储"上分配了使用分配的对象.无论如何...
是的,如果B有一个类型的成员变量,A并且您实例化了一个B使用,new则所有该对象都在免费商店中.
但是,当你这样做时,重要的是要注意:
B* b = new B;
b 本身不在免费商店,而是一个自动变量(即"在堆栈上").在那件事b指向是在空闲存储.自动变量在超出范围时会被销毁 - 但b在这种情况下指向的事物不会被破坏.如果你不这样做delete b;,你会得到内存泄漏.
这可能令人困惑,似乎并不重要.也许这很令人困惑,但这并不重要.事实b是一个自动变量指向免费商店的东西,这使得一个非常重要的习惯用法被称为RAII,用于智能指针之类的东西.
shared_ptr<B> b(new B);
b,这里,仍然是一个自动变量.但是当它b超出范围并被销毁时,就需要注意事项b.在这里使用智能指针将有助于消除delete b上面没有创建的内存泄漏.
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |