c++ - 本地声明的对象的内部内存在范围外完好无损?

标签 c++ pointers scope

f1 函数创建了一个 foo 的实例并设置了 foo.ptr[0] = 2

#include <iostream>
using namespace std;

class foo {
public:
        int *ptr;
        inline foo(int a) {
                ptr = new int[a];
        }
        inline ~foo() {
                delete[] ptr;
        }
};
foo f1() {
        foo a(5);
        a.ptr[0] = 2;
        return a;
}
int main() {
        foo a = f1();
        cout<<a.ptr[0]<<endl;
        return 0;
}

我期望的输出是:垃圾值(value)

f1 返回按值,这意味着制作了 a 的一个拷贝,这个拷贝甚至共享它们的 ( a 及其拷贝)各自的 ptr 指向。

f1 之外,a 被销毁。 它的析构函数被调用,它将释放 ptr 的内存。这意味着拷贝的 ptr 指向的内存位置也是无效的。所以,我希望输出一个垃圾值。

实际输出是2

为什么?

最佳答案

该标准从未说过您应该期待“垃圾值”。相反,它说你会得到未定义的行为。由于您没有遵循三(或五)的规则,因此当 f1 返回并且对象 a 以指向已销毁数组的指针结尾。访问它会给你未定义的行为。

您可能看到值 2 的原因是因为该内存位置自从值 2 存在以来就没有被重用。然而,就标准而言,对此进行推理是没有意义的。

关于c++ - 本地声明的对象的内部内存在范围外完好无损?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627859/

相关文章:

c++ - 将内存从 char* 复制到更大的 char* 中的位置

postgresql - Wildfly Postgres JDBC 模块问题

maven - maven的正确使用方法

java - 设置其他方法识别的变量

c++ - 构造函数中的 const int ref 可以安全地绑定(bind)到文字吗?

c++ - 将多维数组从 C 返回到 Lua

c++ - 函数指针的现代 C++ 替代品

c++ - 如何在设置字符串值时优化函数调用?

c++ - 在 ATL 中使用 STL

pointers - 指针的 Fortran 副本