为什么删除不能没有新的?

时间:2014-11-30 06:18:00

标签: c++

我知道删除应始终与new运算符一起使用。我正在使用以下代码获取Segmentation错误。但是这是什么原因呢。

    #include<iostream>
    using namespace std;
    class A
    {
        public:
            void fun()
            {
                delete this;
            }
    };

    int main()
    {

        A a;
        a.fun();


        return 0;
    }

4 个答案:

答案 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;
}