我是C++的新手,目前正在做一个网络项目,遇到了一个对象指针向量的异常错误。
状态类:
struct State
{
public:
int reject_percent_;
int fill_percent_;
int partial_fill_;
bool is_logged_in_;
struct order
{
long id;
long price;
int quantity;
bool is_filled = false;
bool is_partially_filled = false;
};
std::vector<order *> orders;
};
推入向量:(这里state是state struct的一个对象)
State::order* o;
o->id = (obj->ClOrdID); // obj->ClOrdID = 1
o->price = (obj->Price); // obj->Price = 1
o->quantity = (obj->OrderQty); // obj->OrderQty = 1
std::cout<<o->id<<"\n"; //outputs 1
state->orders.push_back(o);
在其他功能中:
State::order* ord = NULL;
for (int i = 0; i < state->orders.size(); ++i)
{
std::cout<<((state->orders).at(i)->id)<<"\n"; //outputs :: 93893845689152
std::cout<<((state->orders).at(i)->price)<<"\n"; //outputs :: 93893845689184
std::cout<<((state->orders).at(i)->quantity)<<"\n"; //outputs :: 869246848
if(obj->ClOrdID==(state->orders).at(i)->id)
{
ord=(state->orders).at(i);
break;
}
}
我知道这不是一个最小的可复制的示例,但我认为这可能是一个我看不到的小错误,代码很大,将需要很长时间来缩短,所以请容忍我,您能指出可能导致这个问题的原因吗,因为这些值似乎是数据类型的垃圾值。
您没有为订单分配内存,也没有初始化指针
State::order* o;
取消引用此指针以写入其中
o->id = (obj->ClOrdID); // obj->ClOrdID = 1
o->price = (obj->Price); // obj->Price = 1
o->quantity = (obj->OrderQty); // obj->OrderQty = 1
从中读出
std::cout<<o->id<<"\n"; //outputs 1
或复制它
state->orders.push_back(o);
导致未定义的行为。 你的程序可能会崩溃,一切可能看起来都是正确的,或者你的电脑可能会点一个披萨。
很难说用一些代码片段来解决这个问题的最佳方法是什么。 一种方法是更改std::vector
到std::vector
。 另一种方法是使用智能指针。
State::order* o;
o->id = (obj->ClOrdID);
指针的值不确定。 通过这个未初始化的指针进行间接操作的行为是未定义的。
您可能应该使用以下代码:
std::vector<order> orders;
以便向量包含order实例。