所以我在C ++中为类添加了一个析构函数。
class object { ~object() };
用新方法声明一个对象,从而在堆上分配它
object *pointer = new object;
我还需要使用
吗?delete(object);
程序结束时的方法? (析构函数是不是已经对此负责?)
答案 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);
}
}
});
,否则您将发生内存泄漏。
话虽这么说,但是他们不屑一顾并且认为编写一些非常需要的代码 delete
和new
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)
你有两种不同的记忆。 堆栈和堆。
当你超出范围时,堆栈上的所有内容都会自行删除(其中一个删除步骤是调用构造函数)
堆上的所有内容(您调用malloc
,new
等)必须由您自己明确删除(这将导致析构函数被调用)。
像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。