情况:我正在实现一个类似列表的容器,它支持一个Pop()函数,该函数应该返回用户存储在容器前面的const char *。但是,作为一个实现者,我不确定是否应该返回原始的const char *(从容器中删除节点指针但不在const char *本身上调用delete),或者我是否应该分配新的内存和返回元素的副本。
从类和项目中,我遇到了那些总是复制的人,所以之前没有返回的引用(来自getter等)和指向const char *的指针可以改变弹出的版本,但是因为这种方法需要一个额外的分配和strcpy,我想我会问是否只是简单地将原始的,未删除的指针返回给const char而不删除它真的是一个问题。这是方法的分配和复制的代码片段(之后删除原始引用):
const char* LinkedList::PopHeadString()
{
node* deletehead = head_;
char* output = NULL;
if (head_ != NULL && GetHeadType() == STRING) {
output = new char[strlen(head_->en.data.str) + 1];
strcpy(output, head_->en.data.str);
head_ = head_->next;
delete deletehead->en.data.str;
delete deletehead;
--nEntries_;
}
return output;
}
由于Pop()是一个常见的容器操作,我想我会问一般的方法是什么。
提前致谢。
答案 0 :(得分:4)
如果在没有复制的情况下返回指针,则必须决定谁拥有指针。拥有它的人负责在不再需要时将其删除。这可能是一个非常难的问题,特别是如果您的代码变得更复杂。复制语义更容易理解。
在您的具体示例中,要更改的第一件事是使用std::string
而不是const char *
来表示字符串。如果您按值返回std::string
,则会为您处理复制。
如果你真的想要阻止副本,但仍然优雅地管理生命周期,你应该考虑使用std::shared_ptr<std::string>
(如果你没有C ++ 11编译器,则使用boost::shared_ptr<std::string>
) 。 shared_ptr
使用引用计数来确定何时应该释放它指向的对象,从而承担了手动内存管理的负担,这是一个好主意。