从方法范围复制char *

时间:2015-12-18 02:50:03

标签: c++ string scope

我试图找出一种安全的方法,让char *字符串存在于声明原始变量的方法之外。

例如:

void SomeFunc(someclass* c)
{
    char* stringA = "hello";
    c->stringB = stringA;
}

这一切都很好,但是当函数返回时,存储了stringA的内存被破坏,而stringB现在指向一些随机的内存。

什么是一种安全的方法来管理从stringA保留字符串的副本而不将其在stringB中销毁?或者我应该只分配新内存并在以后删除它?

3 个答案:

答案 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::stringstd::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::stringchar的一个方便的包装容器,所以在你的例子中使用它更有意义;但是,如果您使用某种用户定义的对象,则需要在堆上而不是在堆栈上分配内存。您可以/应该使用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的析构函数中释放内存。