繁体   English   中英

删除动态 memory 会改变其他动态分配的 memory

[英]Deleting dynamic memory alters other dynamically allocated memory

对于我的一个课程,我们正在使用尽可能多的基本 C++ 框架来创建一个 class,它读取字符串输入并将数据放入 arrays 数组中。 这是该方法的代码

      std::string* input_line = new std::string;
      std::getline(std::cin, *input_line); 
      std::stringstream input_stream(*input_line);
      if (input_line->empty()) return;
      
      int size_of_sequence;
      input_stream >> size_of_sequence;
      
      // update class members
      sequence_ = new std::array<Object,2>[size_of_sequence];
      size_ = size_of_sequence;

      std::array<Object,2>* ptr = sequence_;
      int diff = sizeof(*sequence_);
      
      for (int i = 0 ; i < (int)size_; ++i) {
        input_stream >> (*ptr)[0];
        input_stream >> (*ptr)[1];
        ptr += diff;
      }
      delete input_line;

但是,我遇到的问题是input_line的删除会更改存储在sequence_的值,特别是第二个数组的第一个值。 我完全不知道为什么这是因为input_line存储在与序列完全不同的位置。 我错过了什么?

编辑:感谢您的回复。 为了消除一些混淆,我们不允许使用向量,并且应该使用指向 arrays 序列的指针。

问题的实际原因是您在此处的未定义行为

  sequence_ = new std::array<Object,2>[size_of_sequence];
  size_ = size_of_sequence;

  std::array<Object,2>* ptr = sequence_;
  int diff = sizeof(*sequence_);
  
  for (int i = 0 ; i < (int)size_; ++i) {
    input_stream >> (*ptr)[0];
    input_stream >> (*ptr)[1];
    ptr += diff;
  }

sizeof是一个很大的危险信号。 正确的代码是

  sequence_ = new std::array<Object,2>[size_of_sequence];
  size_ = size_of_sequence;

  std::array<Object,2>* ptr = sequence_;
  
  for (int i = 0 ; i < (int)size_; ++i) {
    input_stream >> (*ptr)[0];
    input_stream >> (*ptr)[1];
    ++ptr;
  }

当您想通过数组迭代指针时,您只需要使用++ C++ 根据所指向的 object 的大小自动调整指针增量。 无需使用sizeof计算。

但是下面的代码会更简单

  sequence_ = new std::array<Object,2>[size_of_sequence];
  size_ = size_of_sequence;

  for (int i = 0 ; i < (int)size_; ++i) {
    input_stream >> sequence_[i][0];
    input_stream >> sequence_[i][1];
  }

不需要ptr变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM