const char *在while循环的下一次迭代中被覆盖

时间:2014-05-05 09:53:00

标签: c++ qt pointers vector struct

首先,一切都发生在do {} while循环中的if {}语句中。我有一个包含一些const char指针的结构。我试图在每次迭代时使用新的字符串值将信息转换为临时结构,然后将此结构推送到所述结构的向量中,这样当函数退出时,向量将填充不同的结构对象。

do{
   if()
   {
     sound_device_t newDevice;  //<--- Why is this the same mem address each iteration?
                                //I thought it would be destroyed when it's scope was (the if block)


     const char * newPath;
     someFunction(&newPath); //puts a string into newPath
     newDevice.firstString = newPath;   //<-- This works.

     QString otherPath(const char *);
     //...some QString manipulation...//
     newDevice.secondString = otherPath.toLocal8Bit().data();  //<--this doesn't

     vector_of_structs -> push_back(newDevice);

   }
}while (...)

我的印象是push_back将参数struct的值复制到自己的版本中。为什么QString会给我带来麻烦?我正在使用QString,因为它有一些很好的字符串操作函数(即插入和部分),但是如果我需要有用的东西,我会交换它。

我还尝试将QString的数据放入char *然后将其绑定到结构中,但结果相同。每次迭代都会重写newDevice.secondString。

3 个答案:

答案 0 :(得分:2)

只要ByteArray不变,

QByteArray::data()才有效。摧毁临时正在改变。

换句话说,在行newDevice.secondString = otherPath.toLocal8Bit().data();的半冒号后,toLocal8Bit返回的QByteArray被销毁,存储的数组delete d。

答案 1 :(得分:0)

您的代码存在一些问题:

  • 如果声明没有条件(!)

  • 构造无效:QString otherPath(const char *);你可能想要一个&#34; otherPath&#34;变量类似于&#34; newPath&#34;。

  • 您正在将qt类型与std容器混合使用。你应该在QStringList上找一个厕所。

  • 不必要的指针用法:newDevice.secondString = otherPath.toLocal8Bit()。data();

最后一个特别重要,因为你在下一次迭代之前销毁了otherPath。解决方案是在那里使用深层复制。

我会写这样的东西:

do {
   if(cond) {
     sound_device_t newDevice;    

     const char * newPath;
     someFunction(&newPath);
     newDevice.firstString = newPath;

     // Get other path
     QString otherPath(otherPath);
     //...some QString manipulation...
     newDevice.secondQString = otherPath;
     // or: strcpy( newDevice.secondString, otherPath.toLocal8Bit().data());

     vector_of_structs->push_back(newDevice);

   }
} while (...)

话虽如此,根据您的目的,QtMultiMedia可能更适合您的声音设备目的。只要dbus运行,就会有一个QtDBus附加模块。

答案 2 :(得分:0)

感谢所有帮助人员。我只用一个调整就得到了原始代码:

newDevice.secondString = otherPath.toLocal8Bit().data();

应改为

newDevice.secondString = strdup(otherPath.toLocal8Bit().data());

直接进行缓冲区分配,正如@ratchet怪物所暗示的那样。 strcpy()不起作用,因为它仍然将newDevice.secondString与QByteArray连接起来,就像toLatin1()。data()那样。