如何解决传递由QByteArray :: data
我需要从一个函数中的内存安全QString
生成一些包含c样式字符串的复杂结构,然后将该结构传递给另一个函数。我认为这样做的一种安全方法是
char * generateMyStructure();
QString useMyStructure()
{
/* str is in my case a struct that has also an union member that has
another struct inside that has char* C-styled string member. AFAIK
difference between this and plain char* does not matter here. */
char * str = generateMyStructure();
// str is used here
QString result = QString::fromUtf8(str);
// str is not used any more
delete[] str; // UGLY
return result;
}
// This function compiles aforementioned big structure represented
// here by char* from memory-safe QStrings.
char * generateMyStructure()
{
char * result;
QString str = "Hello";
QByteArray bytes = str.toUtf8();
int len = bytes.length();
result = new char[len + 1]; // UGLY
memcpy(result,bytes.data(),len + 1); // UGLY
return result;
}
这不会泄漏,因为// str is used here
部分中没有任何异常,它可以工作。但是,我不认为此代码也不是特别优雅,也不是防止人为错误的最安全代码。
另一种方法是内联generateMyStructure(),然后QByteArray
的析构函数将负责释放内存:
QString useMyStructure()
{
// inlined generateMyStructure
QString qstr = "Hello";
QByteArray bytes = qstr.toUtf8();
char * str = bytes.data();
QString result = QString::fromUtf8(str);
return result;
}
但是,这违背了我的目标:具有小型,易于理解的功能。同样,这肯定会在项目的后期导致某些代码重复。也不是很好,但是像以前的代码一样安全。
我能想到的唯一改善方法是将结构放入类中,并利用RAII将内存处理置于构造函数,析构函数以及setter和getter的后面。但是我所建立的图书馆有大量这样的结构和联合。还有其他更轻巧的方法吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。