c++ - 在 C++ 类中将指针作为成员字段是不是很愚蠢?

标签 c++ pointers heap-memory stack-memory

我想检查一下我是否理解正确。如果我的标题中有以下内容:

public Obj * objPtr;

和类中的以下内容:

void create() {
    //create a local variable object
    Obj localVar = object();
    objPtr = &localVar;
}

void edit(){
    //attempt to edit value of member pointer
    objPtr->edit();
}

我认为它永远不会奏效的想法是否正确?由于 localVar 是本地的,一旦在 create 函数之外,它就会被销毁,从而使 objPtr 具有空内存地址,这意味着 objPtr 是一个空指针?

其次,如果我做到了,它会起作用吗: Obj localVar = new object()objPtr = new object()

最佳答案

Am I correct in thinking that it's never going to work?

只是一部分。您可能会走运并且它可能会起作用,但预期行为是不可预测的(或者更具体地说,未定义)并且绝对是代码中的错误

原因是内容可能会或可能不会再出现在指定地址。用于create 的前堆栈帧的内存被系统重用的时间点取决于几个因素,包括程序接下来要做什么(例如立即调用另一个函数?声明更多变量? ) 以及由编译器为其生成的特定于体系结构的代码。

如果程序选择做一些导致它改变 create 函数的前堆栈帧的事情(例如调用另一个函数),那么你最终会得到未定义的行为 如果您尝试使用指向 &localVar 的指针。

since localVar is local, it will be destroyed once outside of the create function, leaving objPtr to have the address of empty memory

它不会是“空”的内存。在这里说它是一个无效地址可能更准确。如果你幸运的话,你仍然有以前的值(value)(你等待的时间越长,你就越不可能这么幸运)。运气不好,你会得到垃圾。 真的不走运,你得到的东西属于其他东西(例如其他变量),可能会破坏东西或导致段错误。

which means objPtr is a null pointer?

空指针是指地址为零,即 char *ptr = 0;//与 NULL 相同

secondly, would it work if I made it: Obj localVar = new object() or objPtr = new object()

上面的代码是行不通的。您需要使用指针,但 localVar 不是指针。

如果你这样写:

Obj *my_function() {
    Obj *ptrObj = new Obj(); // notice it's a pointer
    // ...
    return ptrObj;
}

然后,是的,它会起作用。但您应该了解为什么会有差异。

在第一种情况下,您将内容放入堆栈,它在函数返回后与 Obj 一起被pop > 本身。在第二种情况下,它起作用是因为堆栈上唯一的东西是指向 Obj指针,但 Obj 实例本身在,当函数返回并移除局部变量时,它在堆栈清理中幸存下来。

由于您的函数现在将地址返回到一个使用new运算符在中分配的对象,那么它将工作正常。

请记住在不再需要时删除对象以避免内存泄漏。

关于c++ - 在 C++ 类中将指针作为成员字段是不是很愚蠢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34301774/

相关文章:

c++ - 为什么 const std::random_device 不可能?

c - 如何以正确的方式将结构的数组传递给我的函数?

在 C 中创建 "classes",在栈上还是在堆上?

C++ - 制作一个 string+int 集 STL 类型

具有临时消除功能的 C++ OpenCL 矩阵库

c++ - 通过 C++ 中的指针列表分配数据

c - 从 btree 中删除 - 未分配被释放的指针

c++ - 聚合方法中的 sigsegv 错误

c - 通过复制返回一个结构,它封装了一个指针

java - 在不修改 catalina.sh 的情况下设置 Java/Tomcat 堆大小(Xmx)