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

c++ delete object outside of creation scope with pointer?

我正在用 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' 两次然后一些 运行dom 垃圾。这是我所期望的。如果您取消注释 'delete &pointer1' 并注释掉第一个 delete 和 运行 程序,您会从输出中得到一个无效指针错误。我假设这是在删除地址,而实际存储在那里的内容仍然存在。

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

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

但是,&pointer1 为您提供了存储 pointer1 本身的地址。而这个内存块还没有被new分配过。因此,在其上调用 delete 是绝对非法的,这正是错误告诉您的内容。

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

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