我知道删除应始终与new运算符一起使用。我正在使用以下代码获取Segmentation错误。但是这是什么原因呢。
#include<iostream>
using namespace std;
class A
{
public:
void fun()
{
delete this;
}
};
int main()
{
A a;
a.fun();
return 0;
}
答案 0 :(得分:4)
delete
必须仅与从new
(或无效点)获得的指针一起使用的原因与您必须使用delete[]
来获取使用{{1}获得的指针的原因相同},即C ++中的指导原则
您不会为不使用的内容付费。
一般
new T[]
可以支持任意指针作为参数,只检查delete
之前是否有任何给定的指针参数,并且仅在这种情况下执行任何操作。但总的来说,效率低下。这将是大多数C ++程序员不需要也不会使用的服务,但仍然会付费。
答案 1 :(得分:1)
删除必须与new一起使用。为什么?
当某个对象上应用了新的运算符compiler do some internal book-keeping
时(您不需要详细说明),这样删除就能正确地解除分配该内存。
您会听说只在对象which are fully constructed
上调用析构函数。不允许在not-fully-constructed objects is efficiency
上调用析构函数的一个原因。如果允许析构函数,那么应该保留额外的簿记,这样删除就可以知道构造了多少对象,从而只删除那么多的内存。
现在更高层次的是什么?
当你使用新的两件事时: -
1) adequate amount of memory is allocated.
2) Then constructors are called to initialize object in that memory.
当你使用删除时,会发生另外两件事: -
1) destructors are called for the objects in memory.
2) memory is de-allocated then.
如果你只使用delete,那么编译器如何执行正确的操作。
在堆栈对象上使用delete: -
如果对象是在堆栈上分配的,那么编译器会在其作用域的末尾生成对析构函数的调用。这意味着你将两次调用析构函数。
除了两次调用析构函数之外,您还将尝试释放从未分配过的内存。
答案 2 :(得分:1)
因为你试图删除堆栈上的东西。
此外,您不应该使用delete this
(非常罕见情况除外)。
答案 3 :(得分:0)
int main() {
A a=new A();
a.fun();
return 0;
}