我只是在学习使用关键字new
和delete
的指针和动态内存分配。
下面是我的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 ptr
在ptr = &n
的情况下不起作用。感谢您为我的理解提供的任何帮助。谢谢
答案 0 :(得分:2)
但是当这样分配指针时:
*ptr = n
。不会发生此类错误。
执行*ptr = n
时,指针不会被删除。这是一个简单的分配操作。 ptr
指向有效的内存。因此,分配给*ptr
没问题。
但是我不知道为什么对于
来说删除delete ptr不起作用ptr = &n
您只能delete
new
获得的内容。 &n
不是这样的指针。执行delete ptr
与执行delete &n
相同。这是不正确的,并且导致未定义的行为。
答案 1 :(得分:1)
但是我不知道为什么对于
来说删除delete ptr不起作用ptr = &n
n
是一个自动变量。删除自动变量的地址具有不确定的行为。
delete
表达式返回的指针以外的任何指针上的 new
表达式都具有未定义的行为(空指针除外;可以安全地删除空值)。这就是指定语言的方式。当行为未定义时,程序可能会产生错误。
ptr = &n
分配new
返回的值。由于该值不再存储在任何地方,因此将不再delete
。这称为内存泄漏。
但是当这样分配指针时:
*ptr = n
。不会发生此类错误。
*
是间接运算符。该表达式未分配指针。 ptr
仍指向动态存储中的对象。它没有指向n
。由new表达式返回的指针上的delete
表达式具有明确的行为。行为是破坏对象并释放内存。
此分配设置由ptr
指向的对象的值。该数字的值现在与变量n
的值相同。