【问题标题】:c++ delete object outside of creation scope with pointer?c++ 用指针删除创建范围之外的对象?
【发布时间】:2018-06-11 22:50:39
【问题描述】:

我正在用 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 仍在内存中?

【问题讨论】:

  • 您完全是在问错误的问题。对于初学者根本和其他任何人在处理写得不好的(遗留)代码时,这些都不重要。专注于从一本好书和最新的书中学习语言,不要在反复试验中浪费宝贵的时间。无论如何,结果往往毫无意义。
  • *pointer1delete pointer1; 之后是UB,delete &amp;pointer1; 也是UB。
  • 使用已删除指针的值是一种未定义的行为,因此这里没有预期的结果。
  • 我回应 @BaummitAugen 的评论。今天的语言学习者几乎不应该使用newdelete;使用标准容器和共享/唯一指针和make_shared/make_unique
  • @BaummitAugen 这就是我不经常使用堆栈溢出的原因。有人说我想学A。然后人们出来说“不,你不想学A而是学B,或者干脆忘记A”。这个地方的人太多,阻碍了其他人学习。

标签: c++ pointers scope memory-address


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答。已将您标记为答案。
猜你喜欢
  • 2015-09-30
  • 2013-10-01
  • 1970-01-01
  • 2019-05-16
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
相关资源
最近更新 更多