【发布时间】:2019-02-01 14:50:42
【问题描述】:
我已经开始学习 C++,需要对 C++ 中的内存管理进行一些说明。我遇到过智能指针,但我想了解一些基本概念。
这是一个示例结构
struct A
{
private:
int a;
void* b;
public:
A(int i, void* m) { a=i; b=m; }
};
main()
{
A * a1 = new A(10, 0);
//
//Some Code
if(on some condition) {
delete a1;
a1=nullptr;
}
}
当我删除 a1 时,m 是否也会被自动删除,或者我应该在删除 a1 之前明确删除 m,如下所示?
delete a1->b;
a1->b = nullptr;
delete a1;
a1=nullptr;
【问题讨论】:
-
我遇到过智能指针我没有看到任何smart pointers。但是,如果您使用它们,则不需要 Basile 在他的回答中提到的显式析构函数
-
一些注意事项:避免在 C++ 中使用
void*,因为几乎总有更好的方法(值得注意的例外:需要void *的旧接口)。void*有很多方法,最常见的可能是模板和继承。 C++ 最重要的习惯用法之一是Resource Allocation Is Initialization。观察 RAII 可以消除许多常见的错误系列。 -
您并没有真正删除指针,而是删除了它们指向的对象。如果你有很多指向同一个对象的指针,你需要小心,这样你只删除一次对象。
-
智能指针被称为是有原因的。普通指针是愚蠢的,它们从不删除自己,你必须以一种或另一种方式这样做。
-
A中没有数据成员m,你不能delete a1->m。你也不能在A之外delete a1->b,因为b是私有的。