删除指针失败

时间:2019-03-22 03:32:28

标签: c++ pointers

我只是在学习使用关键字newdelete的指针和动态内存分配。

下面是我的C ++代码,用于测试我的理解。

#include <iostream>
using namespace std;

int main() {

    // Variable to be pointed to by a pointer
    cout << "Create a double variable" << endl;
    double n = 3.1415926;
    cout << "n = " << n << endl;
    cout << "&n = " << &n << endl << endl;

    // Dynamic memory allocation
    cout << "Dynamically allocate memory to a pointer" << endl;
    double * ptr = new double;
    ptr = &n;       // Error when delete ptr
    // *ptr = n;    // Can delete ptr
    cout << "ptr = " << ptr << endl;
    cout << "*ptr = " << *ptr << endl << endl;


    // Free the pointer memory
    cout << "Delete the pointer" << endl;
    delete ptr;
    cout << "Done" << endl;

    return 0;
}

当指针ptr指向n的地址(即ptr = &n)时。控制台打印输出如下,但有错误。

$ ./test
Create a double variable
n = 3.14159
&n = 0x7ffee304f830

Dynamically allocate memory to a pointer
ptr = 0x7ffee304f830
*ptr = 3.14159

Delete the pointer
test(2436,0x118bf05c0) malloc: *** error for object 0x7ffee304f830: pointer being freed was not allocated
test(2436,0x118bf05c0) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6

但是当这样分配指针时:*ptr = n。不会发生此类错误。此外,ptr指向0x7faa7e400630的地址,而不是n

的地址。

我的理解是,ptr在两种情况下都是有效的指针(具有有效的地址)。但是我不知道为什么delete ptrptr = &n的情况下不起作用。感谢您为我的理解提供的任何帮助。谢谢

2 个答案:

答案 0 :(得分:2)

  

但是当这样分配指针时:*ptr = n。不会发生此类错误。

执行*ptr = n时,指针不会被删除。这是一个简单的分配操作。 ptr指向有效的内存。因此,分配给*ptr没问题。

  

但是我不知道为什么对于ptr = &n

来说删除delete ptr不起作用

您只能delete new获得的内容。 &n不是这样的指针。执行delete ptr与执行delete &n相同。这是不正确的,并且导致未定义的行为。

答案 1 :(得分:1)

  

但是我不知道为什么对于ptr = &n

来说删除delete ptr不起作用

n是一个自动变量。删除自动变量的地址具有不确定的行为。

除(非放置)delete表达式返回的指针以外的任何指针上的

new表达式都具有未定义的行为(空指针除外;可以安全地删除空值)。这就是指定语言的方式。当行为未定义时,程序可能会产生错误。

ptr = &n分配new返回的值。由于该值不再存储在任何地方,因此将不再delete。这称为内存泄漏。

  

但是当这样分配指针时:*ptr = n。不会发生此类错误。

*是间接运算符。该表达式未分配指针。 ptr仍指向动态存储中的对象。它没有指向n。由new表达式返回的指针上的delete表达式具有明确的行为。行为是破坏对象并释放内存。

此分配设置由ptr指向的对象的值。该数字的值现在与变量n的值相同。