【问题标题】:manage memory which was not dynamically allocated管理非动态分配的内存
【发布时间】:2013-11-21 02:33:14
【问题描述】:

我是一名来自 C# 背景的 c++ 程序员,但对 c++ 中的内存管理仍有一些困惑

我有一个具有三个功能的类

1st 返回一个指向局部变量的指针

2nd 返回一个指向指针列表的指针

3rd 返回一个指向指针列表列表的指针

考虑这段代码:

AugmentedActivePastConjugator.h

class AugmentedActivePastConjugator {


    public:

    AugmentedActivePastVerb* createVerb(AugmentedTrilateralRoot* root, int pronounIndex, int formulaNo);

    vector<AugmentedActivePastVerb*>* createVerbList(AugmentedTrilateralRoot* root, int formulaNo);

    vector<vector<AugmentedActivePastVerb*>*>* createAllVerbList(AugmentedTrilateralRoot* root) ;

};

AugmentedActivePastConjugator.cpp

AugmentedActivePastVerb* AugmentedActivePastConjugator::createVerb(AugmentedTrilateralRoot* root, int pronounIndex, int formulaNo) {
    string lastDpa = PastConjugationDataContainer.getLastDpa(pronounIndex);
    string connectedPronoun = PastConjugationDataContainer.getConnectedPronoun(pronounIndex);
    AugmentedActivePastVerb verb (root,lastDpa,connectedPronoun,formulaNo);
    return &verb ;
}

vector<AugmentedActivePastVerb*>* AugmentedActivePastConjugator::createVerbList(AugmentedTrilateralRoot* root, int formulaNo) {
    vector<AugmentedPastVerb *> result;
    for (int i = 0; i < 13; i++) {
        AugmentedActivePastVerb* verb = createVerb(root, i, formulaNo);
        result.push_back(verb);
    }

    return &result;

}

vector<vector<AugmentedActivePastVerb*>*>* AugmentedActivePastConjugator::createAllVerbList(AugmentedTrilateralRoot* root) {
    vector<vector<AugmentedActivePastVerb*>*> result;
    vector<AugmentationFormula*>::iterator  begin = root->getAugmentationList().begin();
    vector<AugmentationFormula*>::iterator  end = root->getAugmentationList().end();
    while (begin !=end) {
        AugmentationFormula* formula =  *begin;
        vector<AugmentedActivePastVerb*>* formulaVerbList = createVerbList(root, formula->getFormulaNo());
        result.push_back(formulaVerbList);
    }
    return &result;
}

如果我想创建这个类返回的动词列表,例如

// general variable
list<AugmentedActivePastVerb *> verbslist;
AugmentedActivePastConjugator conjugator;

void createverbslist()
{
    for (int i=0; i < 20; i++) {
        AugmentedActivePastVerb* verbs = conjugator.createVerb(someroot, pIndex, fNo);
        verbslist.push_back(verb)
    }

}

用完verbslist后应该怎么做,是删除里面的所有指针还是自动释放它们

我读过一篇文章说:

不要释放非动态分配的内存

所以如果我不应该释放它,verbslist

中的那些指针会发生什么

【问题讨论】:

  • AugmentedActivePastVerb verb; return &amp;verb;" 错误并导致 UB。不要返回局部变量的地址。
  • 如果您正在管理内存,请不要返回指针。内存应该由一个对象管理(用于集合的容器,用于单个对象的智能指针)。只有当你绝对拥有指针并且它们不应该表明所有权时,你才会返回指针。

标签: c++ pointers


【解决方案1】:
AugmentedActivePastVerb verb (root,lastDpa,connectedPronoun,formulaNo);
return &verb ;

永远不要这样做。 verb 分配在堆栈上,并在方法调用从堆栈中删除后立即销毁。瞧,您的应用程序指向一个不再存在的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多