gpt4 book ai didi

c++ - 为什么不将对象推送到此 vector (当它是结构的成员时)?

转载 作者:行者123 更新时间:2023-11-28 01:09:41 25 4
gpt4 key购买 nike

我有以下代码,它循环遍历 menuoptions 数组,并在每次迭代时创建一个 ScaledRect 对象并将其推送到一个 vector 。该 vector 是结构的成员。

我已经验证 ScaledRect 是用正确的值创建的,但是当我打印回 regions vector 的内容时(在第二个循环中),循环永远不会终止并且值是垃圾.

class ScaledRect : public Rect
{
public:
ScaledRect(int x1, int y1, int x2, int y2);
};
ScaledRect::ScaledRect(int x1, int y1, int x2, int y2):
_x1(x1), _y1(y1), _x2(x2), _y2(y2){}

// ScaledRect doesn't have copy constructor, but Rect does
Rect::Rect( const Rect &rect)
{
x1=rect.x1; y1=rect.y1; x2=rect.x2; y2=rect.y2; bClean=KD_FALSE;
}

typedef struct
{
std::vector<ScaledRect> regions;
}interface;

void PushRegions( interface * myself )
{
int i = 0;
while(menuoptions[i].callback != -1 )
{
ScaledRect s =
ScaledRect(menuoptions[i].x1,
menuoptions[i].y1,
menuoptions[i].x2,
menuoptions[i].y2);
myself->regions.push_back( s );
i++;
}

std::vector<ScaledRect>::iterator iter = myself->regions.begin();
std::vector<ScaledRect>::iterator done = myself->regions.end();

while(iter != done)
{
iter->Dump();
iter++;
}
}

编辑请注意 - 我刚刚编辑过 - 创建了 theinterface 的内存,我确实将 theinterface 的地址传递给了这个函数。 (但是,我在这里简化了这两行 - 实际发生的是 PushRegions 通过函数的指针调用,在一 block 新分配的内存上,大小为 interface ).

我不能在这里发布所有代码 - 但至少是:

Func pfunc = GetPFuncForInterfaceObj();
size_t numbytes = GetSizeForInterfaceObj();
char memory = new char[numbytes];
pfunc(memory);

pfunc 最终成为 PushRegions 并且 memory 最终作为 interface 传递。

当我将 ScaledRect 对象推送到在 PushRegions() 顶部声明的 vector 时,它起作用了。有没有人知道为什么?

最佳答案

您似乎没有在 PushRegions() 函数中初始化 i。你确定它从 0 开始吗​​?

跟进您的修改:

what actually happens is that PushRegions gets called via a ptr to a function, on a piece of newly allocated memory the size of an interface

这是什么意思?您实际上是在调用 interface 构造函数吗?

跟进您的评论:

是的,有一个(编译器生成的)构造函数。 std::vector 数据成员有一个默认构造函数,由编译器为 interface 生成的构造函数调用。当您分配适当数量的内存时,无需调用构造函数,您将获得一个未初始化的 std::vector!

这解释了为什么您的循环永远不会终止并且产生垃圾结果:您正在使用未初始化的对象,这会导致未定义的行为

关于c++ - 为什么不将对象推送到此 vector (当它是结构的成员时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com