在上面的代码中,我在堆上创建了一个MonkeyFish对象,为它分配了名称,然后将其释放到世界上。假设已经将分配的内存所有权转移给了MonkeyFish对象本身,只有MonkeyFish自己决定何时死亡并删除自己。
现在,在MonkeyFish类中定义"name"数据成员时,我可以选择以下之一:
std :: string name;
std :: string&name;
当我在MonkeyFish类中定义setName()函数的原型时,我可以选择以下之一:
void setName(const std :: string&parameter_name);
void setName(const std :: string parameter_name);
我想最小化字符串副本。实际上,如果可以的话,我想完全消除它们。因此,看起来我应该通过引用传递参数...对吗?
让我困扰的是,似乎我的localname变量将在unleashMonkeyFish()函数完成后超出范围。那是否意味着我被迫进行复制?还是我可以通过引用传递并“逃脱”?
基本上,我想避免以下情况:
我不想设置MonkeyFish的名称,仅在unleashMonkeyFish()函数终止时使localname字符串的内存消失。(这似乎会非常糟糕。)
如果可以的话,我不想复制字符串。
我宁愿不new localname 我应该使用哪个原型和数据成员组合?
澄清:几个答案建议使用静态关键字,以确保在unleashMonkeyFish()结束时不自动释放内存。由于这个应用程序的最终目标是释放N个MonkeyFish(每个都必须具有唯一的名称),因此这不是可行的选项。(而且,毛猴鱼 - 作为多变的生物 - 经常更改它们的名字,有时甚至在同一天内多次更改。)
编辑:Greg Hewgil指出,存储名称变量的引用是非法的,因为它没有在构造函数中设置。我将错误保留在问题中,因为我认为我的错误(以及Greg的更正)可能对第一次遇到此问题的人有用。