首页 > 解决方案 > c++ 用指针删除创建范围之外的对象?

问题描述

我正在用 C++ 做一些学习练习,遇到了一个有趣的问题。以这个示例程序为例。

#include <string>
#include <iostream>

char* pointer1;

void temp() {

    char* s1 = new char;
    *s1 = 'z';
    pointer1 = s1;
    std::cout << *pointer1 << std::endl;
    for (int i = 0; i < 90000; i++) {
        // Waste some processor time.
    }
}

int main() {

    temp();
    std::cout << *pointer1 << std::endl;
    delete pointer1;
    //delete &pointer1;
    std::cout << *pointer1 << std::endl;
    return 0;

}

当您运行它时,它会打印出两次“z”,然后是一些随机垃圾。这是我所期望的。如果您取消注释 'delete &pointer1' 并注释掉第一个删除并运行程序,您会从输出中得到一个无效的指针错误。我假设这是删除地址并且实际存储在那里的内容仍然存在。

我的问题是当调用'delete pointer1'时,它是删除'char* s1'还是只是存储s1的地址?调用“delete &pointer1”时,地址是否被删除但 s1 仍在内存中?

标签: c++pointersscopememory-address

解决方案


指向的地址pointer1已由 分配new。因此,调用delete该地址是正确的,甚至是必要的。

但是,&pointer1为您提供pointer1存储自身的地址。并且这个内存块还没有被分配new。因此,调用它是绝对非法的delete,这正是错误告诉你的。

所以,是的,delete pointer1释放new之前分配的内存。但是不,delete &pointer1除了违法之外什么都做不了。

此外,访问您之前调用的内存delete是未定义的行为。所以,你的第二个*pointer1也不是你想在一个你不想崩溃的程序中写的东西,或者更糟糕的是,它会给你带来不可预测的结果。


推荐阅读