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;

atemp 都指向在行

中分配的相同内存
int* a = new int;

当你使用

delete(a);

该内存已被释放。那时候tempa都是悬空指针

通过使用

a = b;
b = temp;

您将 a 更改为指向有效内存,但现在 btemp 都是悬空指针。

中使用 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;

你复制了指针,所以 atemp 指向相同的东西, 然后在

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;
}