将指针从库返回到应用程序
Return pointer from the library to app
所以,我有一个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&
参数来避免额外的字符串副本。
相关文章:
- 返回主窗口/ C ++后,应用程序正在关闭
- 将数组作为多线程应用程序中函数的返回传递
- DoModal 主应用程序随机返回 -1 代码
- 使用Outlook 2016:MAPISendMail在Windows应用程序中失败,并返回"MAPI_E_FAILURE"作为错误代码
- 当 C++11 应用程序使用非 C++11 库时返回值损坏
- 如何将命令从c++应用程序返回到父终端
- 从 mfc 应用程序点击网络服务,并希望从网络服务登录方法读取用户代码返回
- 从 MFC(c++) 应用程序启动的可执行 jar 中获取返回值
- C++协变返回类型应用程序
- Qt 5.2 DLL返回与应用程序调用DLL不同的结果
- 从ASP.NET应用程序查询Active Directory对象属性将返回旧结果
- 从我的c++应用程序调用c#dll(解析XML文件),将数组/列表返回给c++
- C++控制台应用程序未返回
- PEM_read_RSA_PUBKEY返回并中断应用程序
- 将指针从库返回到应用程序
- 如何在.NET Visual Basic应用程序中读取从C++DLL返回的const char*
- 启动 VirtualBoxSDK 测试应用程序返回错误"Error creating virtual box instance"
- waveOutWrite 缓冲区永远不会返回到应用程序
- 控制台应用程序返回一个奇怪的值
- 如何从c++主应用程序返回值到c# GUI应用程序