析构函数和C ++中的delete()方法

时间:2016-09-28 10:43:49

标签: c++ heap destructor

所以我在C ++中为类添加了一个析构函数。

class object { ~object() };

用新方法声明一个对象,从而在堆上分配它

object *pointer = new object;

我还需要使用

吗?
delete(object); 
程序结束时的

方法? (析构函数是不是已经对此负责?)

7 个答案:

答案 0 :(得分:2)

您仍然必须致电delete(object)。析构函数负责如何删除对象,delete(object)负责删除对象。但在现代C ++中,裸指针的使用被认为是一种非常糟糕的做法。您应该考虑使用智能指针,例如std :: unique_ptr来管理内存。

答案 1 :(得分:0)

析构函数是一种自定义清理过程的方法(添加日志记录,按照三/五规则提供清理等)。您仍然需要 editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { if (s != null && s.toString().length() > 0){ editText.setGravity(Gravity.CENTER); }else{ editText.setGravity(Gravity.START); } } }); ,否则您将发生内存泄漏。

话虽这么说,但是他们不屑一顾并且认为编写一些非常需要的代码 deletenew s(特别是后者) )。如果您需要在堆上存储对象,请使用delete / unique_ptr或像shared_ptr这样的容器。

如果您有时间,我建议您观看来自C ++ Con 2016的Herb Sutter的演讲:Leak-Freedom in C++以获得指导。

答案 2 :(得分:0)

在对象生存期结束时调用析构函数。对于堆分配的对象,这意味着何时删除它们。 所以打电话给

delete(object);

调用你的descructor并释放分配的内存。

答案 3 :(得分:0)

是的,您必须使用Delete方法。

Default destructors调用成员objects的析构函数,但NOT删除指向对象的指针。因此,您需要编写显式调用delete 的析构函数。喜欢,

delete pointer;

答案 4 :(得分:0)

你有两种不同的记忆。 堆栈

当你超出范围时,堆栈上的所有内容都会自行删除(其中一个删除步骤是调用构造函数)

堆上的所有内容(您调用mallocnew等)必须由您自己明确删除(这将导致析构函数被调用)。

unique_ptr / shared_ptr这样的智能指针是一种现代的c ++方法,可以摆脱堆对象上的手动删除,并确保在不再需要对象时将其删除。

答案 5 :(得分:0)

  

我还需要在程序结束时使用delete(object);方法吗?

  

析构函数是不是已经对此负责?

没有

您的delete ptr;调用该析构函数的内容。如果你还没有声明一个析构函数,那么就会为你声明一个析构函数,所以没有任何区别。

当您的对象具有自动存储持续时间时,您不需要编写delete ptr;(非常松散地:“当您没有使用new创建它时”),因为那样等效于你。

但在这两种情况下都会调用析构函数。

答案 6 :(得分:0)

new和delete表达式(不是new和delete运算符)正在调用两个调用:

新:

1) call the operator new for memory allocation
2) invoke the appropriate constructor

删除:

1) invoke the destructor
2) call the operator delete for memory deallocation

因此,您必须将任何new配对删除,以避免资源(内存)泄漏。 但是,对象构造和销毁不需要new和delete。