指针属性在重新检查时发生变化。

问题描述 投票:-1回答:2

本人是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结构的一个对象)

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;
      }
    }

我知道这是 无独有偶,但我觉得这可能是一个我没看到的小错误,代码很大,要花很长时间缩短,所以请耐心等待,你能不能指出可能导致这个问题的原因,因为这些值似乎是数据类型的垃圾值。

c++ c++11 object pointers vector
2个回答
4
投票

你没有为订单分配内存,也没有初始化指针。

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<order *> orders;std::vector<order> orders;. 另一种方法是使用智能指针。


2
投票
State::order* o;

o->id = (obj->ClOrdID);

指针的值是不确定的。通过这个未初始化的指针进行间接操作的行为是未定义的。

你可能应该用这个来代替。

std::vector<order> orders;

这样,向量就会包含订单实例。

© www.soinside.com 2019 - 2024. All rights reserved.