why is the error: Pointer being freed was not allocated
why is the error: Pointer being freed was not allocated
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int* a = new int;
*a = 5;
int* b = new int;
*b = 6;
int* temp = a;
delete(a);
a = b;
b = temp;
cout << *temp << endl;
delete (temp); // error
return 0;
}
错误:malloc:对象 0x7ffdff400630 的 *** 错误:未分配正在释放的指针。
但如果我不 delete(a)
,它会起作用。
当你使用
int* temp = a;
a
和 temp
都指向在行
中分配的相同内存
int* a = new int;
当你使用
delete(a);
该内存已被释放。那时候temp
和a
都是悬空指针
通过使用
a = b;
b = temp;
您将 a
更改为指向有效内存,但现在 b
和 temp
都是悬空指针。
在
中使用 temp
cout << *temp << endl;
delete (temp); // error
不正确。它们都是未定义行为的原因。对于未定义的行为,试图理解发生的事情是没有意义的——任何事情都可能发生。
But if I do not delete(a)
, it works.
有道理。没有那个调用,所有的指针在函数结束之前一直有效。
您应该添加代码以在函数结束之前删除两个指针。但是你必须跟踪哪些指针在调用 delete
.
时有效
您可以打印它们的值来计算。
std::cout << "a: " << (void*)a << std::endl;
std::cout << "b: " << (void*)b << std::endl;
std::cout << "temp: " << (void*)temp << std::endl;
在
int* temp = a;
你复制了指针,所以 a
和 temp
指向相同的东西,
然后在
delete a;
您删除了 a
,因此 temp
变成了悬空指针,取消引用它会导致未定义的行为。
理想情况下你应该这样做
temp = null;
就在 delete
之后,或者为了更好地使用现代 CPP 附带的共享指针。
#include <iostream>
#include <memory>
auto main() -> int
{
auto ptr = std::make_shared<int>(5);
std::cout << "ptr value is " << *ptr << std::endl;
auto ptr1 = ptr; // Reference counted copy
std::cout << "ptr value is " << *ptr1 << std::endl;
std::cout << "Total reference count :" << ptr1.use_count() << std::endl;
ptr.reset(); // Resetting ptr, thus reference count drops to 1
std::cout << "Total reference count :" << ptr1.use_count() << std::endl;;
return 0;
}
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int* a = new int;
*a = 5;
int* b = new int;
*b = 6;
int* temp = a;
delete(a);
a = b;
b = temp;
cout << *temp << endl;
delete (temp); // error
return 0;
}
错误:malloc:对象 0x7ffdff400630 的 *** 错误:未分配正在释放的指针。
但如果我不 delete(a)
,它会起作用。
当你使用
int* temp = a;
a
和 temp
都指向在行
int* a = new int;
当你使用
delete(a);
该内存已被释放。那时候temp
和a
都是悬空指针
通过使用
a = b;
b = temp;
您将 a
更改为指向有效内存,但现在 b
和 temp
都是悬空指针。
在
中使用temp
cout << *temp << endl;
delete (temp); // error
不正确。它们都是未定义行为的原因。对于未定义的行为,试图理解发生的事情是没有意义的——任何事情都可能发生。
But if I do not
delete(a)
, it works.
有道理。没有那个调用,所有的指针在函数结束之前一直有效。
您应该添加代码以在函数结束之前删除两个指针。但是你必须跟踪哪些指针在调用 delete
.
您可以打印它们的值来计算。
std::cout << "a: " << (void*)a << std::endl;
std::cout << "b: " << (void*)b << std::endl;
std::cout << "temp: " << (void*)temp << std::endl;
在
int* temp = a;
你复制了指针,所以 a
和 temp
指向相同的东西,
然后在
delete a;
您删除了 a
,因此 temp
变成了悬空指针,取消引用它会导致未定义的行为。
理想情况下你应该这样做
temp = null;
就在 delete
之后,或者为了更好地使用现代 CPP 附带的共享指针。
#include <iostream>
#include <memory>
auto main() -> int
{
auto ptr = std::make_shared<int>(5);
std::cout << "ptr value is " << *ptr << std::endl;
auto ptr1 = ptr; // Reference counted copy
std::cout << "ptr value is " << *ptr1 << std::endl;
std::cout << "Total reference count :" << ptr1.use_count() << std::endl;
ptr.reset(); // Resetting ptr, thus reference count drops to 1
std::cout << "Total reference count :" << ptr1.use_count() << std::endl;;
return 0;
}