c++ - 返回堆栈变量?

标签 c++ pointers variables heap-memory stack-memory

所以,我一直对 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/

相关文章:

c++ - 在 C++ 中使用邻接列表实现广度优先搜索时出错

c++ - 您如何合法地对舍入 double 执行 mod 运算符?

c++ - 静态变量的返回值

javascript - 将 Javascript 变量附加到 Jquery AJAX URL

c - 删除堆变量给出 munmap_chunk() : invalid pointer error

javascript - javascript 中 2 个数字相加不正确

c++ - 显示列的 SUM() 值时出现问题

c++ - 用于取值和赋值的矩阵下标运算符

c++ - 从指针队列访问结构成员

c++ - constexpr double Point::* coords[3] 究竟是如何工作的?