我想检查一下我是否理解正确。如果我的标题中有以下内容:
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/