所以,我一直对 C++ 指针和......无论另一个叫什么都有点模糊。喜欢,
Object* pointer = new Object();
对比
Object notpointer();
我知道第二个可能涉及指针,但基本上它是一个非指针。 (它实际上叫什么?)
此外,我相信对于第一个,你必须打电话
delete pointer;
在某个时候完成它,对吗?另一个你不需要担心。我读到第一个分配在堆上,但第二个分配在堆栈上,并在方法返回时消失。
但是,当您从函数返回某些东西(不是原语)时怎么办?
Should I return std::strings? 中写了一个很好的例子:
std::string linux_settings_provider::get_home_folder() {
return std::string(getenv("HOME"));
}
根据我之前写的,字符串是在栈上分配的,应该在函数返回时释放,对吧?然而没有人对此发表任何评论,所以我认为它工作正常。为什么?
一般来说,有什么区别
return new std::string("pointer");
和
return std::string("not-pointer");
?
此外,假设两者都有效,两者的优缺点是什么?
最佳答案
当您通过指针返回时,您需要按照您显示的方式返回一个动态分配的对象(即返回一个指向堆栈对象的指针,如果稍后取消引用会导致未定义的行为)。这会造成内存泄漏的可能性,因为正如您所指出的,该对象需要明确删除。
另一方面,按值返回(即第二个片段)会导致将您从堆栈对象返回的对象复制到接收返回值的对象中:
std::string res = get_home_folder(); // std::string gets copied into res
编译器可以对此进行优化以避免通过 return value optimization 进行复制.
关于c++ - 返回堆栈变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939448/