2013-11-08 3 views
0

Я с ++ программистом приходит из C# фона и все еще есть некоторые замешательства по поводу управления памятью в C++управление памятью, которая не была динамически выделяемым

У меня есть класс с тремя функциями

1-й возвращает указатель на локальная переменная

2-й возвращает указатель на список указателей

3-й возвращает указатель на список списков указателей

рассмотреть этот код:

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

+1

'AugmentedActivePastVerb глагол; return &verb; "' неверно и ведет к UB. Не возвращайте адрес локальной переменной. –

+0

Возможный дубликат [Можно ли получить доступ к локальной папке за пределами ее области?] (http://stackoverflow.com/questions/ 6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) –

+0

Не возвращайте указатели, если вы управляете памятью. Память должна управляться объектом (контейнер для коллекций умный указатель для один объект). Вы возвращаете указатели только тогда, когда у вас тоже есть, и они не должны указывать на принадлежность. –

ответ

2
AugmentedActivePastVerb verb (root,lastDpa,connectedPronoun,formulaNo); 
return &verb ; 

Никогда не делайте этого. verb выделяется в стеке и уничтожается, как только вызов метода удаляется из стека. И voila, ваши приложения указывают на переменную, которая больше не на своем месте.

Смежные вопросы