C ++类成员指针vs简单值内存管理

时间:2017-11-19 22:29:57

标签: c++ pointers memory-management struct

我是新手。我对内存管理有一些疑问。

考虑我有以下课程

class SomeClass : public AbstractClass {
private:
   SomeStruct *m_struct_;
public:
    const SomeStruct *get_struct();
};

SomeStruct

struct SomeStruct
{
    std::vector<double> coefficients;    
    double dimension;              
};

这是构造函数

SomeClass::SomeClass(SomeStruct configuration) {
    this->m_struct= &configuration;
}

或者可能是

SomeClass::SomeClass(SomeStruct* configuration) {
    this->m_struct= configuration;
}

我现在正在做的是以下代码

SomeStruct config = get_struct_somewhere();
SomeClass *obj = new SomeClass(config);

你可以在上面看到。我使用get_struct_somewhere,它返回SomeStruct而不是指针SomeStruct*

以下是我在这种情况下理解内存分配的方法。

  1. 函数get_struct_somewhere返回结构,但不是指向结构的指针。这意味着本地函数在Stack中分配一个结构,但是当它返回它时,它会复制Stack中分配的结构。

  2. 因此我得到了结构的副本。但是在我得到之后它仍然被分配在执行此代码的函数的堆栈框架中

  3.   SomeStruct config = get_struct_somewhere();
      SomeClass *obj = new SomeClass(config);
    
    1. 如果使用以下构造函数
    2.  SomeClass::SomeClass(SomeStruct configuration) {
           this->m_struct= &configuration;
       }
      

      它再次复制此结构,但是当我离开构造函数的范围时,此变量将丢失。

      1. 另一个构造函数
      2.  SomeClass::SomeClass(SomeStruct* configuration) {
             this->m_struct= configuration;
         }
        

        就我使用get_struct_somewhere获取结构而言,此变量也会丢失,但在外部范围内

        1. 所以在这种情况下我只有一个选项
        2. SomeClass::SomeClass(SomeStruct configuration) {
              this->m_struct= configuration;
           }
          

          在这种情况下,此变量将被复制三次。结构将被分配给对象,因此将被复制到Heap。只要物体存在,它就会可用。

          请您确认或否认我的理解并解释原因。

          另外,我想知道管理类似情况的对象的最佳方法,我应该如何分配对象,传递它们以保持我的记忆清洁。

          感谢。

2 个答案:

答案 0 :(得分:1)

你已经得到了正确的要点。为了避免这些问题,最简单的解决方案是使成员SomeStruct m_struct_;(即不是指针)。

如果您真的想要一个指针,那么请将该成员设为std::unique_ptr<SomeStruct> m_struct_;std::shared_ptr<SomeStruct> m_struct_;,具体取决于您是否需要&#34;浅拷贝&#34;复制类时的成员。

在这些情况下,您需要注意设计构造函数,以便在调用者切换所有权时(或者是否)将其清除,以便调用者可以避免出现内存分配错误。

此外,如果不希望此函数的调用者拥有该struct的所有权,get_struct()最好返回SomeStruct const&

答案 1 :(得分:0)

2)对象按值返回(如你所说,在调用者堆栈中复制),但随着它退出get_struct_somewhere()的范围而被销毁

5)您无法将SomeStruct configuration分配给SomeStruct *m_struct_。您必须将其指定为指针,并在构造函数范围结束时(不希望这样)留下悬空指针,或将SomeStruct *m_struct_转换为SomeStruct *m_struct_并制作另一个指针正如你所说,复制。

要做的两件事:

  • 使用std :: unique_ptr包装你的类型,让unique_ptr为你处理内存释放

  • 如果您的类型,请为您的类型实施move constructor/assignment 关注复制费用。