C++ 内存清理问题将QString转换为char*用于第三方库,如何解决?

C++ 内存清理问题将QString转换为char*用于第三方库,如何解决?,c++,qt,memory-leaks,C++,Qt,Memory Leaks,我正在使用第三方库和Qt,它需要char*字符串。我正在使用以下代码将QString转换为char* char* toCharArray(const QString &string) { QByteArray bytes = string.toLocal8Bit(); char* data = new char[bytes.count() + 1]; strcpy(data, bytes.data()); return data; } // later

我正在使用第三方库和Qt,它需要
char*
字符串。我正在使用以下代码将QString转换为
char*

char* toCharArray(const QString &string)
{
    QByteArray bytes = string.toLocal8Bit();
    char* data = new char[bytes.count() + 1];
    strcpy(data, bytes.data());
    return data;
}

// later on...

3rdPartyObject->3rdPartyMethod(toCharArray("someFile"));
除了做这样的乱七八糟的事情之外,我还能做些什么来确保我返回的
char*
被清理干净

char* path = toCharArray("someFile");
3rdPartyObject->3rdPartyMethod(path); // The class and method called can differ
delete[] path;

您可以使用智能指针,例如在智能指针超出范围时自动删除内存。

您可以使用智能指针,例如在智能指针超出范围时自动删除内存。

为什么不直接使用

QString s;
3rdPartyObject->3rdPartyMethod( s.toLocal8Bit().data() );
在语句末尾销毁临时QByteArray将清除所有资源。

为什么不直接使用

QString s;
3rdPartyObject->3rdPartyMethod( s.toLocal8Bit().data() );

在声明末尾销毁临时QByteArray将清除所有资源。

谢谢。这确实有效。。。我在别处读到的一些东西让我相信它不会。我想我应该待在堆栈溢出上。:)更好的方法是:尽可能使用constData()(函数采用constchar*)。保存额外的分离(data()可能会在内部不必要地复制数据)@Frank-绝对。我只是在匹配行动所需的类型+1@Frank是的
const
不是实际数据类型的一部分,因此我没有将其包含在我的问题中,因为它不相关+1对于任何看到你评论的谷歌用户来说。为了完整起见,“别处”指的是官方Qt文档:,上面写着“
const char*c_str2=str2.toLatin1().data();
将使应用程序崩溃,因为QByteArray没有被存储,因此不再存在”。。。我不认为,应该知道这将在我的特殊情况下工作的规则,根据C++ +谢谢。这确实有效。。。我在别处读到的一些东西让我相信它不会。我想我应该待在堆栈溢出上。:)更好的方法是:尽可能使用constData()(函数采用constchar*)。保存额外的分离(data()可能会在内部不必要地复制数据)@Frank-绝对。我只是在匹配行动所需的类型+1@Frank是的
const
不是实际数据类型的一部分,因此我没有将其包含在我的问题中,因为它不相关+1对于任何看到你评论的谷歌用户来说。为了完整起见,“别处”指的是官方Qt文档:,上面写着“
const char*c_str2=str2.toLatin1().data();
将使应用程序崩溃,因为QByteArray没有被存储,因此不再存在”。。。我没有思考,应该知道这将在我的特殊情况下工作的规则,根据C++的规则…