【问题标题】:pointer attribute changes when reexamined重新检查时指针属性发生变化
【发布时间】:2020-10-05 00:02:47
【问题描述】:

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

我知道这不是一个最小的可重现示例,但我认为这可能是一个我看不到的微不足道的错误,代码很大并且需要很长时间才能缩短,所以请请耐心等待,您能否指出可能导致此问题的原因,因为这些值似乎是数据类型的垃圾值。

【问题讨论】:

    标签: c++ c++11 object pointers vector


    【解决方案1】:

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

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

    导致未定义的行为。您的程序可能会崩溃,一切似乎都正确,或者您的计算机可能会点披萨。

    仅使用一些代码 sn-ps 很难说解决此问题的最佳方法是什么。一种方法是将std::vector&lt;order *&gt; orders; 更改为std::vector&lt;order&gt; orders;。另一种方法是使用智能指针。

    【讨论】:

    • and you are storing a pointer to unallocated memory state-&gt;orders.push_back(o); That causes undefined behavior 这有点误导。 push_back(o) 是 UB,因为函数读取值并且读取不确定值的行为未定义。如果指针是用一个实际的无效指针值初始化的,那么将它存储到向量中就不会是 UB。
    • 酷,感谢您提供的信息丰富的答案,我是 C++ 新手,并尝试动手学习项目,我确信这是我所缺少的基本知识;)。
    【解决方案2】:
    State::order* o;
    
    o->id = (obj->ClOrdID);
    

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

    你应该改用这个:

    std::vector<order> orders;
    

    使向量包含订单实例。

    【讨论】:

    • 我还建议使用唯一指针向量。在不了解项目完整、完整的代码的情况下,很难判断一个简单的值是否可以,或者是否真的需要指针
    • @GuillaumeRacicot 我通常希望避免在示例中引入额外的动态分配,除非示例说明需要动态分配。我认为示例代码中不需要动态分配。
    • 很酷,感谢您提供的信息丰富的答案,我是 C++ 新手,并且正在尝试动手学习项目,我确信这是我所缺少的基本知识 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2017-08-18
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多