C++ 指向动态分配对象的指针向量:会出现什么问题?
我在这里发布之前签出了此帖子: 基本上,我有一些指向动态分配对象的指针向量:C++ 指向动态分配对象的指针向量:会出现什么问题?,c++,pointers,vector,memory-management,C++,Pointers,Vector,Memory Management,我在这里发布之前签出了此帖子: 基本上,我有一些指向动态分配对象的指针向量: vector<MyType*> a; a.push_back(new MyType()); 您根本不应该使用原始指针,避免这种情况的最佳方法是使用智能指针,唯一指针,如果您不共享共享的向量内容,如果容器元素在多个enity之间共享 使用智能指针很可能会帮助您解决问题 除此之外,在没有看到源代码的情况下,我们不能评论到底出了什么问题 如果编译器支持C++0x,您可以为STL容器创建自己的可复制引用计数智能指
vector<MyType*> a;
a.push_back(new MyType());
您根本不应该使用原始指针,避免这种情况的最佳方法是使用智能指针,
唯一指针
,如果您不共享共享的向量内容
,如果容器元素在多个enity之间共享
使用智能指针很可能会帮助您解决问题
除此之外,在没有看到源代码的情况下,我们不能评论到底出了什么问题 如果编译器支持C++0x,您可以为STL容器创建自己的可复制引用计数智能指针类,或者使用
std::unique_ptr
。如果它稍微旧一点,您可能在std::tr1
名称空间中有一些内容
交替考虑<代码> STD::vector < /代码>,因为容器在堆上连续地分配,并将为您管理内存。不惜一切代价避免使用原始指针。
我应该补充一点,我会使用boost库中漂亮的自动指针,但我的客户只想要使用标准库的代码,并明确要求不使用boost代码。相信我,我试图说服他们,但他们不想让步。TR1是一种选择吗?这是最新的编译器附带的,您可以制作一个包含std::tr1::shared_ptr
s的容器来解决您的问题。可疑的可能包括地址不正确的写操作和内存覆盖。@Andrew Wiens:几乎所有最有可能的都是您可能需要的(根据上述答案中提到的需要)它们是:std::tr1::shared_ptr
或std::unique_ptr
,请远离auto_ptr
,但它不是为与STl容器一起使用而设计的。它们必须可复制才能与STl容器一起使用std::auto_ptr
无法使用,因为它在分配时交换所有权,因此无法复制。@Andrew:根据标准,STL容器支持所有推荐的智能指针。请注意,auto_ptr是最早的智能_指针。以C++0x开头的已弃用,容器不支持!
resources_ <3 items> std::vector<VisaResource*>
[0] VisaResource
function_ <not accessible> std::string
name_ <not accessible> std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 6998928 uint
[1] VisaResource
function_ "lane_clksel" std::string
name_ "m1_lane0_clksel" std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 0 uint
[2] VisaResource
function_ "lane_bypass" std::string
name_ "m1_lane0_bypass" std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 0 uint
visa_res_itr __gnu_cxx::__normal_iterator<VisaResource**, std::vector<VisaResource*>>