Я только изучаю указатель и динамическое распределение памяти с ключевыми словами 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
. Любая помощь для облегчения моего понимания приветствуется. Спасибо