为什么会出现错误:未分配正在释放的指针
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
不正确。它们都是未定义行为的原因。对于未定义的行为,试图理解发生的事情是没有意义的——任何事情都可能发生。
但是如果我不
delete(a)
,它就可以了。
这是有道理的。如果没有该调用,所有指针将继续有效,直到函数结束。
不过,您应该在函数结束之前添加代码以删除这两个指针。但是,您必须跟踪哪些指针在调用delete
时使用有效。
您可以打印它们的值来计算出来。
std::cout << "a: " << (void*)a << std::endl;
std::cout << "b: " << (void*)b << std::endl;
std::cout << "temp: " << (void*)temp << std::endl;
in
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;
}
相关文章:
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 如何在向量中释放指针?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 错误:释放指针未分配在矢量模板类C 中
- 如何在指针初始化为数组的第一个索引后释放指针
- 如何释放指针树中的所有内存
- 从 std::align 中释放指针
- C :释放指针没有分配在课堂上
- 构造向量 C++ 后无法释放指针
- nullptr是否释放指针的内存
- C/C++ 通过调用引用或直接释放指针
- 分段释放指针向量的错误
- 有效地从指向对象本身释放指针
- 如何释放指针向量中的元素
- Sqlite c/c++api,负责从sqlite3_column_text中释放指针
- 释放指针后分配给指针
- 正在释放指针