【问题标题】:C++ Memory Management: RAII, Smart Pointers and GCC++ 内存管理:RAII、智能指针和 GC
【发布时间】:2015-04-17 01:55:26
【问题描述】:

以下是我对 C++ 内存管理的看法,欢迎评论。

内存可以分配在stackheap中。

规则 1:

如果两个嵌套堆栈需要共享数据,请使用堆栈中的RAII分配内存,如下所示:

func1() {
    Resource res;  // res will be destructed once func1 returns
    func2( &res );
}  

规则 2:

如果两个并行栈需要共享数据(不是类成员字段),则必须在中分配内存,使用智能点或GC。例如:

func() {
    shared_ptr<Resource> res = func1();   // returned a shared ptr to a memory allocated in func1
    func2( res );
}

我说的对吗?

【问题讨论】:

  • 您的问题到底是什么?至于什么,标准?因为严格来说 C++ 没有“堆栈”或“堆”的概念,至少在讨论内存模型时没有。
  • RAII,在涉及多态时使用shared_pointer

标签: c++ memory-management garbage-collection smart-pointers


【解决方案1】:

我的观点是你是对的,(并行堆栈我想是多线程)

在第一种情况下也可以使用scoped_ptr(boost) 或unique_ptr(c++11)。在这种情况下,对象在内存中分配heap 而不是stack。并且 RAII 也会在作用域完成后释放该内存。

shared_ptr 是一种引用计数机制,因此如果其他对象保留shared_ptr(在您的情况下为:func2),并且在您的func 范围完成后没有释放它,则对象shared_ptr 仍然存在可用。

【讨论】:

  • 案例 2 的示例是单线程的,所以我认为您对此阅读过多。
  • @MSalters 我不太了解并行堆栈,因为单线程一次只能有一个堆栈。
  • 悟饭,是的,一个线程只有一个堆栈。在这里,我将一个函数视为一个堆栈。
  • 我现在更了解你了,在你的情况 2 中,func1 分配一个对象,然后返回。 Resource res = func1()Resource 是一个大对象而不是资源句柄时,这种方法被认为无效,最好使用 scoped_ptr/shared_ptr 这样做。 (c++ 11 有一个移动赋值运算符,我认为它可以帮助你使用Resource res = func1() 类似的方法,具有与 xxx_ptr 方法一样的性能)
【解决方案2】:

没有。您的示例 2 最好写成

void func() {
    Resource res = func1();   // func1 returns a Resource
    func2( res ); // func2 uses that Resource.
}

【讨论】:

  • 我不同意你的观点。 'res' 一旦离开 func1() 就会被销毁,因此必须返回一个原始指针(在 func2() 之后手动删除)或 smart_pointer。如果你的意思是“res”持有一个指向内部内存块的指针,那么“res”本身就是一个智能指针。
  • @Zach:错了。 res 甚至在func1 中都不存在,所以它不能被销毁。但是只要用std::string作为资源试试:从func1,返回std::string("Hi"),看到上面的代码会把Hi传给func2
  • std::string 被引用计数。见:stackoverflow.com/questions/12520192/…
  • @Zach:请注意,链接的问题专门讨论了 GCC,并且指出 GCC 的实现实际上是错误的。即便如此,这也不会改变任何事情。 std::string 不是智能指针,因为它缺少 operator*operator-&gt;
  • MSalters:在你的代码中,func1()返回Resource,你能展示func1()的内部代码吗?它是如何分配内存的?
猜你喜欢
  • 2010-09-28
  • 2010-10-22
  • 1970-01-01
  • 2014-06-02
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多