将指针从库返回到应用程序

Return pointer from the library to app

本文关键字:应用程序 返回 指针      更新时间:2023-10-16

所以,我有一个lib文件,其中我有将字符串转换为char*的函数:

void Additional::str2Char(string s,char** cstr)
{
    *cstr = new char[s.length() + 1];
    *cstr = (char*) s.c_str();
}

然后,我创建控制台应用程序,并执行以下操作:

int main()
{
    Additional *a = new Additional();
    string b = "fdfd";
    char *test;
    a->str2Char(b, &test);
    cout << test << endl;
    delete a;
}

输出真的很糟糕..帮帮我,我不知道如何正确从 lib 获取指针。

首先分配一些内存。

然后,将指针重新分配给该内存,以指向本地字符串s的内容,泄漏您分配的内存。

然后你从函数返回,破坏s,让指针悬空。它不再指向有效数据,取消引用它会产生未定义的行为。

最好的解决方案是停止弄乱指针和new,并将std::string用于所有字符串。如果你真的想这样做,那么你需要将字符串内容复制到新的内存中:

*cstr = new char[s.length() + 1]; // no change
std::strcpy(*cstr, s.c_str());    // copy the data, including the terminator

如果库不打算修改文本,那么c_str()调用就足够了。无需创建字符指针/数组。

如果要修改文本:https://stackoverflow.com/a/13294114/47351

strncpy(tab2, tmp.c_str(), sizeof(tab2));
tab2[sizeof(tab2) - 1] = 0;

由于您想处理函数内的内存分配,因此可以使用不同的 API:

// Creates a const char* and copies the contents of s to it. Caller
// takes ownership of the returned data.
const char* str2cstr(const string& s) {
    char* cstr = new char[s.size()];
    strncopy(cstr, s.c_str(), s.size());
    return cstr;
}

现在你可以做const char* cstr = str2cstr(str);.另请注意,我正在使用const string&参数来避免额外的字符串副本。