我有权访问一个类(不是我写的),它将const char*
作为构造函数中的参数。如果我有一个字符串,我想传递值作为参数,传递它的安全方式是什么,请记住字符串和类对象可能有不同的作用域?将字符串作为常量字符传递*
我没有访问该类的源代码,所以不要认为它的做法像将字符串复制到类成员中一样健全。
举一个具体的例子,这不起作用:
#include <iostream>
#include <string>
class example {
public:
example(const char*);
const char* str;
};
example::example(const char* a) : str(a) {}
int main() {
std::string* a=new std::string("a");
example thisDoesntWork(a->c_str());
std::cout << thisDoesntWork.str << std::endl;
delete a;
std::cout << thisDoesntWork.str << std::endl; //The pointer is now invalid
a=new std::string("b");
std::cout << thisDoesntWork.str << std::endl;
}
这个工作(只要我可以告诉)更换构造函数,但显然是很可怕:
example thisDoesWorkButIsAwful((new const std::string(*a))->c_str()); //Memory leak!
同样:
char* buffer=new char[a->size()+1];
strcpy(buffer,a->c_str()); //with #include <string.h> added up top
example(buffer);
但是,这又容易发生内存泄漏。
我目前的主要想法是制作一个围绕example
的包装类,它将字符串复制到char *
缓冲区,并在超出范围时删除缓冲区,但看起来有点过分。有更简单/更好的方法吗?
更糟糕的是,它可能会承担指针的所有权,并尝试稍后“释放”它。这是特别有趣的,如果你传递一个字符串文字,虽然我想这样的行为是不是在C API以外的常见:) – melak47
@ melak47我(很漂亮)确定它至少没有这样做。尽管在这一点上我很少会感到惊讶。 ;) – Chris