场景:我正在实现一个类似列表的容器,它支持一个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()是一个常见的容器操作,所以我想问一下一般的方法是什么。
发布于 2012-05-14 14:21:13
如果返回指针而不进行复制,则必须决定谁拥有该指针。拥有它的人负责在不再需要它时将其删除。这可能是一个非常困难的问题,特别是当你的代码变得更加复杂的时候。复制语义的推理要简单得多。
在您的特定示例中,首先要更改的是使用std::string而不是const char *来表示字符串。如果您通过值返回一个std::string,它将为您处理复制。
如果您确实想要防止复制,但仍然要优雅地管理生命周期,那么您应该考虑使用std::shared_ptr<std::string> (如果没有C++11编译器,则使用boost::shared_ptr<std::string> )。shared_ptr使用引用计数来确定何时应该释放它所指向的对象,从而减轻了手动内存管理的负担,这是一个好主意。
https://stackoverflow.com/questions/10578150
复制相似问题