Я с ++ программистом приходит из 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
'AugmentedActivePastVerb глагол; return &verb; "' неверно и ведет к UB. Не возвращайте адрес локальной переменной. –
Возможный дубликат [Можно ли получить доступ к локальной папке за пределами ее области?] (http://stackoverflow.com/questions/ 6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) –
Не возвращайте указатели, если вы управляете памятью. Память должна управляться объектом (контейнер для коллекций умный указатель для один объект). Вы возвращаете указатели только тогда, когда у вас тоже есть, и они не должны указывать на принадлежность. –