将 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 &amp;&amp; i != 0) 同时具备这两个条件有什么意义? TL;DR:不要在 C++ 中使用 newdelete。您的代码充满了未定义的行为。如果需要在堆上分配对象,请使用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

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

meas.push_back(dist); 

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

delete dist;

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

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

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

【讨论】:

感谢您的回复!我使用 char 的原因是因为我在需要 char 的函数中使用它,但正如有人在评论中所说的那样,有一个 c_str 函数。 请记住c_str() 返回一个const CharT* (const char*) 并且不能用于写入std::string

以上是关于将 char* 推送到向量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到向量中 [已解决]的主要内容,如果未能解决你的问题,请参考以下文章

使用 monogoose 将对象推送到节点 js 中的数组属性时出现错误

推送到 bitbucket 时出现错误“inotify_add_watch”

使用 Eclipse DDMS 将大文件推送到模拟器/SD 卡时出现问题

2FA 推送到 GitHub 时出现问题

从 Visual Studio Code (1.62.2) 推送到 GitHub 时出现“致命:身份验证失败”

尝试将我的应用程序推送到 heroku 时出现此错误 FileNotFoundError: [Errno 2] No such file or directory: '/app/gettingstar