我试图找出一种安全的方法,让char *字符串存在于声明原始变量的方法之外。
例如:
void SomeFunc(someclass* c)
{
char* stringA = "hello";
c->stringB = stringA;
}
这一切都很好,但是当函数返回时,存储了stringA的内存被破坏,而stringB现在指向一些随机的内存。
什么是一种安全的方法来管理从stringA保留字符串的副本而不将其在stringB中销毁?或者我应该只分配新内存并在以后删除它?
答案 0 :(得分:1)
如果你使用的是“c ++ std :: string”,只要c-> stringB是一个std :: string本身,上面的代码就可以正常工作.Reason是std :: string内部生成字符串的副本而它将为你做新的分配任务。
class someclass{
public:
std::string stringB ;
};
void SomeFunc(someclass* c)
{
char* stringA = "hello";
c->stringB = stringA;
}
以上代码可以正常使用。
如果因为你不想使用“std :: string”,你需要做同样的工作,即分配一个新的内存,将本地字符串传递给它并返回它。建议仍然是std :: string。
答案 1 :(得分:1)
由于您正在使用char
,因此最简单,最好的方法是使用std::string
! std::string
将处理复制本地对象并允许您在函数外部使用它:
std::string CreateWord()
{
return "hello";
}
int main()
{
const auto word = CreateWord(); // create the word
std::cout << word << std::endl; // print the word to console
}
因为std::string
是char
的一个方便的包装容器,所以在你的例子中使用它更有意义;但是,如果您使用某种用户定义的对象,则需要在堆上而不是在堆栈上分配内存。您可以/应该使用std::unique_ptr
而不是原始指针来实现此目的:std::unique_ptr
允许您安全地分配和转移内存的所有权,并使可读性更具意义:
std::unique_ptr<UserObject> CreateObj()
{
return std::make_unique<UserObject>();
}
int main()
{
auto obj = CreateObj();
// Use UserObject...
}
CreateObj()
将分配内存来存储单词,然后返回指向该内存的指针。
答案 2 :(得分:0)
只为stringB分配内存并将stringA的值复制到stringB的区域。记得在someclass的析构函数中释放内存。