Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向动态分配对象的指针向量:会出现什么问题?_C++_Pointers_Vector_Memory Management - Fatal编程技术网

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*>>