[英]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.