C++ 将堆栈分配的对象作为指针参数发送给其他函数好吗?
将堆栈分配对象作为指针参数发送到其他函数是否合适?如果您确定调用是同步的,则将堆栈分配对象的地址发送到函数是完全有效的。如果调用是异步的(即,您调用的函数将指针传递到不同的线程)然后,它肯定会产生问题,因为即使在堆栈分配的对象被破坏之后,您也可能尝试从不同的线程访问内存地址。只要接收函数不假设它获得资源的所有权(并尝试释放),当然。不过,引用可能是一个更好的主意。对于同步函数调用来说,它非常合适。如果调用是异步的,当堆栈对象在超出范围时被删除时,它可能导致崩溃。C++ 将堆栈分配的对象作为指针参数发送给其他函数好吗?,c++,function,parameters,C++,Function,Parameters,将堆栈分配对象作为指针参数发送到其他函数是否合适?如果您确定调用是同步的,则将堆栈分配对象的地址发送到函数是完全有效的。如果调用是异步的(即,您调用的函数将指针传递到不同的线程)然后,它肯定会产生问题,因为即使在堆栈分配的对象被破坏之后,您也可能尝试从不同的线程访问内存地址。只要接收函数不假设它获得资源的所有权(并尝试释放),当然。不过,引用可能是一个更好的主意。对于同步函数调用来说,它非常合适。如果调用是异步的,当堆栈对象在超出范围时被删除时,它可能导致崩溃。 是的,但是对于这种情况更常见的C
是的,但是对于这种情况更常见的C++习惯用法是使用引用(而可能是const r引用)而不是指针。所以不是
void foo( sometype * p ) {
p->func();
}
你写道:
void foo( sometype & p ) {
p.func();
}
这样做的优点是不需要取消调用方中的对象引用:
void afunc() {
sometype t;
foo( t );
}
还向读者提供了一个潜意识提示,即您不希望函数拥有对象的所有权。您应小心不要存储该指针以供进一步使用。例如:
void store(int* param) {
// Store pointer in some global storage for further use
global_storage.add_param(param);
}
void func() {
int test_var = 5;
store(&test_var); // Pass the pointer to the global storage
}
// At this point stack object test_var will be destroyed
// Global storage contains a pointer, that points to some garbage
这当然是正确的,但有很多警告。以下是需要记住的最重要的事情(有些已经被其他人提到了,有些没有。)
- 指针本身可能意味着资源所有权被传递给被调用方(即,他们必须在使用后释放它)。这里有一个参考
- 在许多情况下,您需要调用的函数已经定义,您无法更改它,您必须研究它的行为,并确保它不会假定它将拥有该对象、静态存储该对象或将其复制到其他位置
- 如果您正在调用的函数需要使用空指针来指示没有所述参数,那么您将没有使用引用的选择
- 异步调用是绝对不允许的(当然,除非您使用本地对象阻止它们,直到它们完成并返回)
- 被调用的函数在任何情况下都不应该访问超过所讨论对象大小的对象,这将破坏堆栈,几乎肯定会使程序崩溃李>
- 调用容易访问超出对象大小的字节的函数可能是一种安全隐患。实际上,这是入侵安全系统的最常见方法。这称为缓冲区溢出。(超出您的问题范围,但您可以阅读更多内容)