将 char* 推送到矢量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到矢量中

Problem pushing char* to vector, but after each iteration its adding a pointer to the same values buffer into the vector

本文关键字:缓冲区 添加 指针 char 问题 迭代      更新时间:2023-10-16

[已解决] 我将 char 变量更改为std::string数组,在那里我将浮点变量推送到数组中。完成所有这些之后,您可以将std::string转换为const char*

我正在使客户端到服务器。我想将数据发送到服务器,但是当我运行此代码时,我得到了两次 4.5 而不是 180 和 4.5。我正在使用字符,因为我使用的发送函数仅支持字符。

清空字符(不起作用) 在 if 语句结束之前打印值(这表明该值是正确的),但是当 for 循环第二次循环时,它是 4.5 而不是 180。

float an = 180;
float dis = 4.5;
for (int i = 0; i < 1; i++) {
set.measurements.push_back(an); 
set.measurements.push_back(dis);
}
for (int i = 0; i < set.measurements.size(); i++){
sprintf(values, "%0.1f", set.measurements[i]);
if (i == 1 && i != 0){
std::cout << "{ 4.5 }" << 'n'; // expected output
char *dist = new char[10];
dist = values; // <-- Value is 4.5
meas.push_back(dist); 
// This is 4.5 but the angle doesn't stay 180
delete dist;
}
if (i == 0 && i != 1){
std::cout << "{ 180 }" << 'n'; // Expected output
char *ang = new char[10];
ang = values; // <-- Value is 180 here
meas.push_back(ang); 
delete ang;
}
}
for (int i = 0; i < 2; i++) {
std::cout << &*meas[0] << 'n';
}

我预计输出是180和4.5,但实际输出是4.5和4.5

char *dist = new char[10];

这将分配一个新的char数组,并将dist设置为指向它。

dist = values; // <-- Value is 4.5

下一行立即替换指向new-ed 缓冲区的dist指针,从而泄漏此内存。现在,这会将dist设置为指向其他缓冲区(大概)。

meas.push_back(dist); 

现在,这会将指向values对象的指针添加到矢量中。因此,循环的每次迭代最终都会将指向同一values缓冲区的指针添加到向量中,这就是您最终看到的。

delete dist;

这仍然指向values.从上下文来看,values最初不太可能是用new创建的,即使是这样,循环的每次迭代最终也会delete相同的指针。无论哪种方式,这都是未定义的行为,并且通过足够的循环,整个程序可能会崩溃。

第二个if语句重复了上述所有错误。

由于您的意图显然是编写C++代码,因此您实际上应该使用C++库,即格式化的输出运算符和std::string,这将为您正确分配和管理所有内存,从而消除这些常见的逻辑错误。