【问题标题】:C++: Incoherent deletion from the Stack? [duplicate]C++:从堆栈中不连贯的删除? [复制]
【发布时间】:2018-03-09 14:55:58
【问题描述】:

我试图了解如何使用 C++ 中的函数返回数组。我想了解这里发生了什么。这是我的代码,我用 g++ -Wall return_array.cpp -o return_array 编译的

#include <iostream>

int * do_something(int number){
    int viz[3] = {1,2,3};
    viz[2] += number;
    return &viz[0];
}


int main(){
    int *viz;
    viz = do_something(3);

    std::cout << viz[2] << "\n";
    return 0;
}

这给了我以下错误:

return_array.cpp: In function ‘int* do_something(int)’:
return_array.cpp:4:6: warning: address of local variable ‘viz’ returned [-Wreturn-local-addr]
  int viz[3] = {1,2,3};

根据我的研究,该错误是由于我试图访问一个在离开函数作用域后已从堆栈中删除的指针。但是,如果我使用解决方法运行代码:

int * do_something(int number){
        int viz[3] = {1,2,3};
        int *pointer;
        viz[2] += number;
        pointer = &viz[0];
        return pointer;
    }

它编译并运行得很好。这个新指针不是在完全相同的情况下吗?一旦我离开该函数,它就超出了范围,应该从堆栈中删除,使用与以前相同的参数。我错过了什么?

编辑: 我的问题不是将指针返回到本地数组是否会产生错误。它应该而且确实如此。问题是为什么已经分配给指向同一个数组的指针的指针没有!

【问题讨论】:

  • 编译器能为你做的只有这么多。如果您坚持解决有效错误而不是尝试解决实际错误情况,编译器可能会将其标记为错误,也可能不会。这确实是相同的情况,但由于您使用的是别名,编译器无法检查这个问题,而它可以返回数组的地址。编译器不是无所不知的。
  • 谢谢,我相信这可以澄清我的疑问。我不知道编译器不会检测到这种错误。我以后会考虑到这一点。

标签: c++ pointers memory-management stack


【解决方案1】:

一旦控制离开函数,数组就会超出范围。它可能被删除,也可能不会。该内存区域可能在一段时间内仍包含这些数字,也可能不会。尝试读取它可能会起作用,或者它可能会做任何事情。这被称为未定义的行为,这是一件难以检测的事情,也是一件避免的好事。

【讨论】:

  • 啊,我想我现在明白了,感谢 Richard Chambers 的评论和您的回复。所以实际上情况相同,但在一种情况下,编译器会抱怨它,而在另一种情况下则不会。所以我不能指望通过这个程序获得可靠的结果。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2013-02-16
  • 2012-12-05
  • 2010-10-19
  • 2015-05-14
  • 1970-01-01
  • 2013-08-11
  • 2020-02-19
相关资源
最近更新 更多