将 char* 推送到向量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到向量中 [已解决]
Posted
技术标签:
【中文标题】将 char* 推送到向量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到向量中 [已解决]【英文标题】:Problem pushing char* to vector, but after each iteration its adding a pointer to the same values buffer into the vector 【发布时间】:2019-11-01 01:20:53 【问题描述】:[已解决] 我将 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
【问题讨论】:
您需要出示您一直在调试的minimal reproducible example。ang = values;
只会导致您泄漏new
分配的内存,然后您尝试删除values
。 之后你将指针推回它,即(但没有看到其余代码,谁知道meas
是什么以及它对指针的作用)。
if (i == 1 && i != 0)
同时具备这两个条件有什么意义?
TL;DR:不要在 C++ 中使用 new
和 delete
。您的代码充满了未定义的行为。如果需要在堆上分配对象,请使用std::shared_ptr
。另外,请使用std::string
而不是char*
。如果您需要它作为char*
,它有一个c_str()
成员函数。
我可以推荐你a good book学习C++吗?通过猜测进行编码可能适用于某些语言,但这是学习 C++ 的糟糕方式,而且每隔一行就会咬你一口。
【参考方案1】:
char *dist = new char[10];
这会分配一个新的char
数组,并设置dist
指向它。
dist = values; // <-- Value is 4.5
下一行立即将dist
pointer 替换为new
-ed 缓冲区,从而泄漏此内存。现在,这会将 dist
设置为指向其他缓冲区(可能是)。
meas.push_back(dist);
这会将指向values
对象的指针添加到向量中。因此,循环的每次迭代最终都会将指向同一 values
缓冲区的指针添加到向量中,这就是您最终看到的。
delete dist;
这仍然指向values
。从上下文来看,values
最初不太可能是用new
创建的,即使是这样,循环的每次迭代都会以delete
结束相同的指针。无论哪种方式,这都是未定义的行为,如果循环足够多,您的整个程序可能会崩溃。
第二个if
语句重复了上述所有错误。
显然,由于您的意图是编写 C++ 代码,因此您应该实际使用 C++ 库,即格式化输出运算符和 std::string
s,它将为您正确分配和管理所有内存,消除这些类型常见的逻辑错误。
【讨论】:
感谢您的回复!我使用 char 的原因是因为我在需要 char 的函数中使用它,但正如有人在评论中所说的那样,有一个 c_str 函数。 请记住c_str()
返回一个const CharT*
(const char*
) 并且不能用于写入std::string
以上是关于将 char* 推送到向量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到向量中 [已解决]的主要内容,如果未能解决你的问题,请参考以下文章
使用 monogoose 将对象推送到节点 js 中的数组属性时出现错误
推送到 bitbucket 时出现错误“inotify_add_watch”
使用 Eclipse DDMS 将大文件推送到模拟器/SD 卡时出现问题
从 Visual Studio Code (1.62.2) 推送到 GitHub 时出现“致命:身份验证失败”
尝试将我的应用程序推送到 heroku 时出现此错误 FileNotFoundError: [Errno 2] No such file or directory: '/app/gettingstar