【问题标题】:Std::Array with unique_ptr具有 unique_ptr 的 Std::Array
【发布时间】:2016-09-19 13:56:31
【问题描述】:

我有一个类,我希望通过传递一个值数组来实例化它。这里的对象有两个成员,但为了说明而减少了。将来我将从磁盘读取值,然后从这些值创建一个对象,从而创建数组。该对象稍后将有多个指针,因此 shared_ptr。

首先,我想知道这是否可以防止内存泄漏。其次,我想知道是否有不那么臃肿的方式来实例化对象,然后确定性地销毁它们。

类头文件:

//MyClass.hpp
#pragma once
#include "stdafx.h"
#include <array>

class SimpleClass{
    private:
        //Per object
        double var1;
        double var2;
    public static:
        //For calling when using templates such as std::array<>
        //Using __int8 as will not be > 256
        static const uint8_t varCount 2;
        SimpleBody(std::array<double, varCount> inputArray);
        ~SimpleBody();
}

类实现

//MyClass.cpp
#pragma once
#include "stdafx.h"
#include <array>
#include "body.hpp"

SimpleBody::SimpleBody(std::array<double, SimpleBody::varCount> inputArray ) {
    //Assign var1
    MyClass::var1= inputArray[0];
    //Assign var2
    MyClass::var2= inputArray[1];
};

SimpleBody::~SimpleBody() {
    //Add in code here when children need deleting
}; 

入口点

// EntryPoint.cpp
//

#include "stdafx.h"
#include "MyClass.hpp"
#include <array>
#include <memory>

int main()
{
    //Create an array with a smart pointer for memory management
    std::unique_ptr< std::array<double, MyClass::varCount> > initArray =
        std::make_unique< std::array<double, MyClass::varCount> >();
    //Define values
    *initArray = { 1.0,2.0 };
    //Use array to create object
    std::shared_ptr<MyClass> object = std::make_shared<MyClass>(*initArray );

    //Free memory
    initArray.reset();
    object.reset();

    return 0;
}

【问题讨论】:

  • 我无法理解您的问题,但我认为您需要花一些时间学习 C++ 的基础知识。
  • 你不需要手动释放唯一和共享ptr的内存。他们会自己做。而且你总是取消引用你唯一的 ptr 数组。你可以把它保存在堆栈上,而不是在堆上实例化它。
  • 我一个做过一段时间开发的朋友曾经告诉我,当你知道你不需要它时,最好显式释放内存,然后当你忘记时,smart_ptr 功能可以充当安全网。是他只是书呆子还是有时依靠 smart_ptr 释放内存会导致内存泄漏?
  • @Flash_Steel 这只是迂腐。这种 RAII 视图背后的整个概念是让您可以忘记它们并专注于重要的事情。
  • 与其提前发布,我认为限制智能指针的范围会更好。否则,您最终可能会取消引用空智能指针或必须始终检查它们是否不为空。我的建议是,尽可能将它们创建为非空,并且不要在它们的范围结束之前将它们清空。

标签: c++ arrays templates smart-pointers


【解决方案1】:

在您的示例中,您可以跳过唯一指针,因为无论如何您只想要值

int main()
{
    std::array<double, MyClass::varCount> initArray = { 1.0,2.0 };
    std::shared_ptr<MyClass> object = std::make_shared<MyClass>(initArray );
    return 0;
}

这也是一样的。

对于“不那么臃肿”:

总有auto

int main()
{
    auto initArray = std::make_unique< std::array<double,  MyClass::varCount> >();
    *initArray = {1.0,2.0};
    auto object = std::make_shared<MyClass>(*initArray );
    return 0;
}

【讨论】:

  • 不那么臃肿的可能是MyClass({{1., 2.}});。很难说,因为OP的大部分代码似乎都没有理由。
  • 好吧,我假设 shared_ptr 是必要的,并且您在其中放置了一个数组。但是对于 OP 代码来说,这将是最少的代码。
【解决方案2】:

首先,如果您在 SimpleBody 构造函数中按值传递数组,这很糟糕。最好使用参考

 SimpleBody(const std::array<int, varCount> &inputArray);

目前,您构建 shared_ptr 时 unique_ptr 会失去数组的所有权。您无需手动重置。此外,此刻,您的程序点击 } 行,内存将被释放。

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多