c ++用指针删除创建范围之外的对象?

时间:2018-06-11 22:50:39

标签: c++ pointers scope memory-address

我正在用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&amp; pointer1'并注释掉第一个删除并运行程序,你会从输出中得到一个无效的指针错误。我假设这是删除地址,实际存储的内容仍然存在。

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

1 个答案:

答案 0 :(得分:4)

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

但是,&pointer1会为您提供存储pointer1本身的地址。并且new尚未分配此内存块。因此,在它上面调用delete是完全违法的,这正是错误告诉你的。

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

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