0

在结构中访问它们时,我似乎无法写入标准容器向量、映射和多映射(只有我尝试过的)。这是我正在尝试做的一个例子:

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 代码中崩溃。我尝试了几种解决方法,包括对向量语句进行类型定义,但没有奏效。似乎有希望作为一种解决方法的一个是将函数放入结构中并调用该函数......

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.

有什么办法可以解决最初的问题,即访问结构内声明的容器会导致访问问题?

4

2 回答 2

1

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

于 2013-03-20T23:47:35.487 回答
0

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

  1. B 类在创建新对象时为 *pp 分配内存,但在复制时不这样做(即复制构造函数中的浅拷贝)。

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

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

当您尝试通过静态引用做同样的事情时,不会发生删除(静态对象一旦超出范围就不会被删除)。您的对象和向量内的相应对象都一直指向有效内存,并且不会发生崩溃。

于 2013-03-20T11:10:27.037 回答