当我尝试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) 是否有推荐的策略来处理期望手动管理原始指针的外部库.例如,一个采用指针向量的方法:
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)
第二个版本在异常或错误的情况下似乎更安全,但它确实存在悬挂指针的风险.我错过了一些明显的东西吗?你会做什么?