如果我将char *传递给函数。我想把那个char *转换为std :: string,一旦我得到我的结果,就从std :: string将它转换回char *来显示结果。
所以我需要做的步骤
如果可能的话,我可以通过引用vs一个指针来看它是如何完成的(它的地址我通过值传入但是我仍然可以修改指针指向的值。所以即使指针地址的副本在函数被破坏我仍然看到外面改变的值。
谢谢!
答案 0 :(得分:43)
将char*
转换为std::string
:
char* c = "Hello, world";
std::string s(c);
将std::string
转换为char*
:
std::string s = "Hello, world";
char* c = new char[s.length() + 1];
strcpy(c, s.c_str());
// and then later on, when you are done with the `char*`:
delete[] c;
我更喜欢使用std::vector<char>
而不是实际char*
;然后你不必管理自己的记忆:
std::string s = "Hello, world";
std::vector<char> v(s.begin(), s.end());
v.push_back('\0'); // Make sure we are null-terminated
char* c = &v[0];
答案 1 :(得分:1)
您需要观察从返回的指针处理内存的方式,例如下面的代码将无效,因为当fn()退出时,std :: string中分配的内存将被释放。
const char* fn(const char*psz) {
std::string s(psz);
// do something with s
return s.c_str(); //BAD
}
一种解决方案是在函数中分配内存并确保函数的调用者释放它:
const char* fn(const char*psz) {
std::string s(psz);
// do something with s
char *ret = new char[s.size()]; //memory allocated
strcpy(ret, s.c_str());
return ret;
}
....
const char* p = fn("some text");
//do something with p
delete[] p;// release the array of chars
或者,如果您知道字符串大小的上限,您可以自己在堆栈上创建它并传入指针,例如
void fn(const char*in size_t bufsize, char* out) {
std::string s(psz);
// do something with s
strcpy_s(out, bufsize, s.c_str()); //strcpy_s is a microsoft specific safe str copy
}
....
const int BUFSIZE = 100;
char str[BUFSIZE];
fn("some text", BUFSIZE, str);
//ok to use str (memory gets deleted when it goes out of scope)
答案 2 :(得分:0)
您可以为您的库维护一个垃圾收集器
std::vector<char*> g_gc;
可在您的库'lib'中访问。稍后,您可以通过调用lib::release_garbage();
char* lib::func(char*pStr)
{
std::string str(pStr);
char *outStr = new char[str.size()+1];
strcpy(outStr, str.c_str());
g_gc.push_back(outStr); // collect garbage
return outStr;
}
release_garbage函数将如下所示:
void lib::release_garbage()
{
for(int i=0;i<g_gc.size();i++)
{
delete g_gc[i];
}
g_gc.clear();
}
在单线程模型中,您可以将此g_gc保持为静态。多线程模型将涉及锁定/解锁它。