在 C++ 中使用 delete 避免内存泄漏
Avoid memory leak with delete in C++
我有以下代码:
class A{
A(){};
};
class B{
A **a;
public:
B(){
a = new A*[10];
}
~B(){
delete[] a;
}
};
int main()
{
B* b1 = new B();
//delete B;
return 0;
}
我想知道 main 中动态对象 b1 的正确删除是什么?据我了解,我们不需要在 main 中添加删除,因为对象 B 作为指针的动态数组并在 return 上调用析构函数。是吗?
如果您使用 new
创建对象,则需要 delete
:
B* b1 = new B();
...
delete b1;
或者,您可以使用智能指针,它们会为您调用 delete
:
std::unique_ptr<B> b1( new B );
注意:要使用 unique_ptr
,您需要包含 <memory>
。
we don't need to add a delete in main since the object B as a dynamic array of pointers and calls the destructor on return. Is that right?
不,那是错误的。
如果你用 new
分配了一些东西而不用 delete
释放那个指针,那么分配就会泄漏。
P.S。 B
非常不安全,因为它是可复制的,但复制它会导致未定义的行为。
what is the proper delete for dynamic object b1 in main?
b1
不是动态对象。它是一个指针,指向一个动态对象。
管理动态分配的正确方法是不要使用裸拥有指针。此外,应避免不必要的动态分配。示例:
class B{
std::vector<A*> a;
public:
B() : a(10){}
};
int main()
{
B b;
}
我有以下代码:
class A{
A(){};
};
class B{
A **a;
public:
B(){
a = new A*[10];
}
~B(){
delete[] a;
}
};
int main()
{
B* b1 = new B();
//delete B;
return 0;
}
我想知道 main 中动态对象 b1 的正确删除是什么?据我了解,我们不需要在 main 中添加删除,因为对象 B 作为指针的动态数组并在 return 上调用析构函数。是吗?
如果您使用 new
创建对象,则需要 delete
:
B* b1 = new B();
...
delete b1;
或者,您可以使用智能指针,它们会为您调用 delete
:
std::unique_ptr<B> b1( new B );
注意:要使用 unique_ptr
,您需要包含 <memory>
。
we don't need to add a delete in main since the object B as a dynamic array of pointers and calls the destructor on return. Is that right?
不,那是错误的。
如果你用 new
分配了一些东西而不用 delete
释放那个指针,那么分配就会泄漏。
P.S。 B
非常不安全,因为它是可复制的,但复制它会导致未定义的行为。
what is the proper delete for dynamic object b1 in main?
b1
不是动态对象。它是一个指针,指向一个动态对象。
管理动态分配的正确方法是不要使用裸拥有指针。此外,应避免不必要的动态分配。示例:
class B{
std::vector<A*> a;
public:
B() : a(10){}
};
int main()
{
B b;
}