Std::Array 和 unique_ptr
Std::Array with unique_ptr
我有一个 class,我希望通过传递一组值来实例化它。此处的对象有两个成员,但为了便于说明,已对其进行了缩减。将来我将从磁盘读取值,然后从这些值创建一个对象,因此创建数组。该对象稍后将有多个指针,因此 shared_ptr。
首先,我想知道这是否可以防止内存泄漏。其次,我想知道是否有更简单的方法来实例化对象然后确定性地销毁它们。
Class 头文件:
//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();
}
Class 实施
//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;
}
首先,如果您在 SimpleBody 构造函数中按值传递数组,这很糟糕。最好使用参考
SimpleBody(const std::array<int, varCount> &inputArray);
目前,您构建 shared_ptr unique_ptr 失去了数组的所有权。您不需要手动重置。另外,此时,您的程序运行到 } 行,内存将被释放。
在您的示例中,您可以跳过唯一指针,因为无论如何您只需要值
int main()
{
std::array<double, MyClass::varCount> initArray = { 1.0,2.0 };
std::shared_ptr<MyClass> object = std::make_shared<MyClass>(initArray );
return 0;
}
这样做也是一样的。
对于"less bloated":
总有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;
}
我有一个 class,我希望通过传递一组值来实例化它。此处的对象有两个成员,但为了便于说明,已对其进行了缩减。将来我将从磁盘读取值,然后从这些值创建一个对象,因此创建数组。该对象稍后将有多个指针,因此 shared_ptr。
首先,我想知道这是否可以防止内存泄漏。其次,我想知道是否有更简单的方法来实例化对象然后确定性地销毁它们。
Class 头文件:
//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();
}
Class 实施
//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;
}
首先,如果您在 SimpleBody 构造函数中按值传递数组,这很糟糕。最好使用参考
SimpleBody(const std::array<int, varCount> &inputArray);
目前,您构建 shared_ptr unique_ptr 失去了数组的所有权。您不需要手动重置。另外,此时,您的程序运行到 } 行,内存将被释放。
在您的示例中,您可以跳过唯一指针,因为无论如何您只需要值
int main()
{
std::array<double, MyClass::varCount> initArray = { 1.0,2.0 };
std::shared_ptr<MyClass> object = std::make_shared<MyClass>(initArray );
return 0;
}
这样做也是一样的。
对于"less bloated":
总有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;
}