gpt4 book ai didi

c++ - Pop() 礼仪

转载 作者:太空狗 更新时间:2023-10-29 21:05:11 24 4
gpt4 key购买 nike

情况:我正在实现一个类似列表的容器,该容器支持 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() 是一种常见的容器操作,我想我应该问一下一般方法是什么。

最佳答案

如果您不复制就返回指针,您必须决定谁拥有该指针。拥有它的人有责任在不再需要时将其删除。这可能是一个非常困难的问题,尤其是当您的代码变得更加复杂时。复制语义的推理要简单得多。

在您的具体示例中,首先要更改的是使用 std::string而不是 const char *来表示字符串。如果您返回 std::string根据值(value),它将为您处理复制。

如果你真的想防止复制,但仍然优雅地管理生命周期,你应该考虑使用 std::shared_ptr<std::string> (或者 boost::shared_ptr<std::string> 如果你没有 C++11 编译器)。 shared_ptr使用引用计数来确定何时应该释放它指向的对象,从而减轻您手动内存管理的负担,这是一个好主意。

关于c++ - Pop() 礼仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10578150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com