首先,一切都发生在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。
答案 0 :(得分:2)
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()那样。