首页
学习
活动
专区
圈层
工具
发布

Pop()礼仪
EN

Stack Overflow用户
提问于 2012-05-14 14:04:37
回答 1查看 225关注 0票数 3

场景:我正在实现一个类似列表的容器,它支持一个Pop()函数,该函数应该向用户返回存储在容器前端的const char*。然而,作为实现者,我不确定我是否应该返回原始的const char* (从容器中删除节点指针,但不调用const char*本身的delete ),或者我是否应该分配新的内存并返回元素的副本。

在类和项目中,我遇到过那些总是支持复制的人,这样就不会有以前返回的引用(来自getter等)。指向const char*的指针可以改变弹出的版本,但由于这种方法需要额外的分配和strcpy,我想我应该问一下,简单地将原始的、未删除的指针返回到const char而不删除它是否真的是一个问题。下面是使用分配和复制(然后删除原始引用)的方法的代码片段:

代码语言:javascript
复制
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()是一个常见的容器操作,所以我想问一下一般的方法是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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使用引用计数来确定何时应该释放它所指向的对象,从而减轻了手动内存管理的负担,这是一个好主意。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10578150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档