小编jac*_*ild的帖子

使用与unique_ptr的联合

当我尝试std :: move或std :: make_unique时,尝试在union中使用unique_ptr会给我一个段错误.

#include <iostream>
#include <memory>

union myUnion{
    struct{std::unique_ptr<float> upFloat;}structUpFloat;
    struct{std::unique_ptr<int> upInt;}structUpInt;
    myUnion(){}
    ~myUnion(){}
};
struct myStruct{
    int x;
    myUnion num;

};
int main()
{
    myStruct aStruct, bStruct;
    aStruct.x = 1;
    bStruct.x = 2;

    auto upF = std::make_unique<float>(3.14);
    auto upI = std::make_unique<int>(3);

    aStruct.num.structUpFloat.upFloat = std::move(upF);
    bStruct.num.structUpInt.upInt = std::move(upI);

    std::cout << "aStruct float = " << *aStruct.num.structUpFloat.upFloat << std::endl;
    std::cout << "bStruct int = " << *bStruct.num.structUpInt.upInt << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,使用普通指针按预期工作:

#include <iostream>
#include <memory>

union …
Run Code Online (Sandbox Code Playgroud)

c++ struct unique-ptr unions c++11

15
推荐指数
2
解决办法
2731
查看次数

使用智能指针进行手动内存管理的最佳策略?

是否有推荐的策略来处理期望手动管理原始指针的外部库.例如,一个采用指针向量的方法:

ALibraryFunc(std::vector<ALibraryData*> p);
Run Code Online (Sandbox Code Playgroud)

所以通常你会用以下的东西创建你的矢量:

std::vector<ALibraryData*> myVec;
for(...)
{
    myVec.push_back(new ALibraryData(args));
}
//and then
ret = ALibraryFunc(myVec);
//and then
for(auto &a:myVec)
{
    delete a;
}
myVec.clear();
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用智能指针,但图书馆不会接受它们.这让我想知道这样的事情是否比手动做得更臭:

std::vector<std::unique_ptr<ALibraryData>> myVecUP;
std::vector<ALibraryData*> myVec;
for(...)
{
    myVecUP.push_back(std::make_unique<ALibraryData>(args));
    myVec.push_back(myVecUP.back().get());
}
//and then
ret = ALibraryFunc(myVec);
myVec.clear();
myVecUP.clear();
Run Code Online (Sandbox Code Playgroud)

第二个版本在异常或错误的情况下似乎更安全,但它确实存在悬挂指针的风险.我错过了一些明显的东西吗?你会做什么?

c++ c++11

4
推荐指数
1
解决办法
186
查看次数

标签 统计

c++ ×2

c++11 ×2

struct ×1

unions ×1

unique-ptr ×1