我是新手。我对内存管理有一些疑问。
考虑我有以下课程
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*
。
以下是我在这种情况下理解内存分配的方法。
函数get_struct_somewhere
返回结构,但不是指向结构的指针。这意味着本地函数在Stack
中分配一个结构,但是当它返回它时,它会复制Stack
中分配的结构。
因此我得到了结构的副本。但是在我得到之后它仍然被分配在执行此代码的函数的堆栈框架中
SomeStruct config = get_struct_somewhere(); SomeClass *obj = new SomeClass(config);
SomeClass::SomeClass(SomeStruct configuration) { this->m_struct= &configuration; }
它再次复制此结构,但是当我离开构造函数的范围时,此变量将丢失。
SomeClass::SomeClass(SomeStruct* configuration) { this->m_struct= configuration; }
就我使用get_struct_somewhere
获取结构而言,此变量也会丢失,但在外部范围内
SomeClass::SomeClass(SomeStruct configuration) { this->m_struct= configuration; }
在这种情况下,此变量将被复制三次。结构将被分配给对象,因此将被复制到Heap
。只要物体存在,它就会可用。
请您确认或否认我的理解并解释原因。
另外,我想知道管理类似情况的对象的最佳方法,我应该如何分配对象,传递它们以保持我的记忆清洁。
感谢。
答案 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 关注复制费用。