在结构中访问它时,我似乎无法写入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.
有没有办法绕过最初的问题,访问结构中声明的容器导致访问问题?
答案 0 :(得分:1)
答案 1 :(得分:0)
这是“B”级的完整代码吗?如果是,那么粘贴的代码中没有明显的问题。如果不是,那么导致崩溃的可能情况之一可能是:
B类在创建新对象时将内存分配给* pp,但在复制时不执行相同操作(即复制构造函数中的浅拷贝)。
在向量中插入对象时,它会调用复制构造函数将对象复制到向量存储空间中。由于浅拷贝,插入的对象和向量内部的对象共享由pp指向的相同指针。
现在对象超出了范围,析构函数删除了pp指向的内存。此对象的向量对象仍然指向此内存并尝试访问某处。
当您尝试通过静态引用执行相同操作时,不会发生删除(一旦超出范围,静态对象就不会被删除)。你的对象和向量内的相应对象都指向有效的内存,不会发生崩溃。