容器在结构内部崩溃?

时间:2013-03-20 08:52:11

标签: c++ stl struct containers

在结构中访问它时,我似乎无法写入std容器vector,map和multimap(只有我尝试过的)。以下是我正在尝试做的一个例子:

struct B
{
    void* pp;
};

struct A
{
    std::vector< B* > veEvents;
};

在某个类函数中

A* d = new A;

B* f = new B;
d->veEvnts.push_back( f );  //<< this line crashes 

尝试以这种方式访问​​容器会导致STD崩溃。它在STD代码中在重新启动此指针的行上崩溃。我尝试了几种解决方法,包括typedef'ing vector语句,但是没有用。似乎有希望作为一种解决方法的方法是在结构中放置一个函数并调用函数...

struct B
{
   void* pp;
};

struct A
{
    void K( B* f )
    {
        static std::vector< B* > veEvents;

        veEvnts.push_back( f );  //<< this line crashes 
    }
};

在某个类函数中

A* a = new A;
B* b = new B;
a->K(b);   //This seems to work.

有没有办法绕过最初的问题,访问结构中声明的容器导致访问问题?

2 个答案:

答案 0 :(得分:1)

好的,好的!了解它的底部。 Ivaylo对于存在堆栈损坏是正确的。有问题的指针指向类的成员变量区域上的向量。该向量最初是在那里创建的,复制到堆上相同结构类型的另一个结构,但向量仍然指向类堆栈。我试着写一本深刻的副本,但是来自另一个班级。那没用。所以我从一开始就在堆上创建了一个struct,并用它来保存第一遍的变量。稍后,在不同的类中,使用堆上的结构,对向量的访问起作用。原始结构应该首先以这种方式创建。再次感谢你们。我感谢你的帮助。

答案 1 :(得分:0)

这是“B”级的完整代码吗?如果是,那么粘贴的代码中没有明显的问题。如果不是,那么导致崩溃的可能情况之一可能是:

  1. B类在创建新对象时将内存分配给* pp,但在复制时不执行相同操作(即复制构造函数中的浅拷贝)。

  2. 在向量中插入对象时,它会调用复制构造函数将对象复制到向量存储空间中。由于浅拷贝,插入的对象和向量内部的对象共享由pp指向的相同指针。

  3. 现在对象超出了范围,析构函数删除了pp指向的内存。此对象的向量对象仍然指向此内存并尝试访问某处。

  4. 当您尝试通过静态引用执行相同操作时,不会发生删除(一旦超出范围,静态对象就不会被删除)。你的对象和向量内的相应对象都指向有效的内存,不会发生崩溃。