将堆栈分配的对象作为指针参数发送给其他函数是否合适?
答案 0 :(得分:12)
是的,但对于这种情况,更常见的C ++习惯用法是使用引用(可能是const引用)而不是指针。而不是
void foo( sometype * p ) {
p->func();
}
你写道:
void foo( sometype & p ) {
p.func();
}
这样做的好处是您不需要取消引用调用者中的对象:
void afunc() {
sometype t;
foo( t );
}
并且还向读者提供潜意识提示,即您不打算将该函数用于获取对象的所有权。
答案 1 :(得分:10)
如果您确定该调用是同步的,那么将堆栈分配对象的地址发送给该函数是完全有效的。如果调用是异步的(即您调用的函数将指针传递给另一个线程),那么它肯定会产生问题,因为即使在堆栈分配的对象被破坏后,您也可能尝试从不同的线程访问内存地址。
答案 2 :(得分:6)
只要接收功能没有假设它获得资源的所有权(并试图释放它),当然。但参考可能是一个更好的主意。
答案 3 :(得分:2)
它非常适合同步函数调用。如果调用是异步的,当堆栈对象超出范围时,它可能会导致崩溃。
答案 4 :(得分:2)
您应该注意不要存储该指针以供进一步使用。例如:
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
答案 5 :(得分:1)
这当然有效,但有许多警告。以下是要记住的最重要的事情(有些已经被其他人提及,有些则没有。)