Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将堆栈分配的对象作为指针参数发送给其他函数好吗?_C++_Function_Parameters - Fatal编程技术网

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

这当然是正确的,但有很多警告。以下是需要记住的最重要的事情(有些已经被其他人提到了,有些没有。)

  • 指针本身可能意味着资源所有权被传递给被调用方(即,他们必须在使用后释放它)。这里有一个参考
  • 在许多情况下,您需要调用的函数已经定义,您无法更改它,您必须研究它的行为,并确保它不会假定它将拥有该对象、静态存储该对象或将其复制到其他位置
  • 如果您正在调用的函数需要使用空指针来指示没有所述参数,那么您将没有使用引用的选择
  • 异步调用是绝对不允许的(当然,除非您使用本地对象阻止它们,直到它们完成并返回)
  • 被调用的函数在任何情况下都不应该访问超过所讨论对象大小的对象,这将破坏堆栈,几乎肯定会使程序崩溃
  • 调用容易访问超出对象大小的字节的函数可能是一种安全隐患。实际上,这是入侵安全系统的最常见方法。这称为缓冲区溢出。(超出您的问题范围,但您可以阅读更多内容)

虽然假设是简单的C语言或C++语言构造,但不能异步调用任何函数。阿萨夫的答案更接近日常生活。lothar-fork()怎么样?任何仍在单个线程中运行的非平凡程序都是恐龙。对此进行修改。@MaxVT调用fork决不是异步调用函数的方法,您的整个过程都是重复的(包括它的所有数据)。“可能还有一个常量引用”:常量&s很好,应该尽可能使用,但当函数打算更改参数值时,您应该传递一个指针,而不是一个引用,这样就可以清楚地看到您想要修改参数。Mem所有权应妥善记录