LINUX.ORG.RU

new без deletenew без delete


0

0


Помогите, пожалуйста с дизайном функции: есть два альтернативных
парсера. Оба происходят от одного виртуального предка.
Вызов конструктора - берет много времени, так как должен загрузить
и обработать очень много предварительных данных. Дана функция ф,
которая вызывается очень много раз и использует нужный парсер:

1 void f(bool forceInit=false){
2 extern Options options;
3
4 static bool firstTime=false;
5 static Parser * parserPtr;
6 if(firstTime || forceInit){
7 fisrtTime=false;
8 if(parserPtr!=NULL) delete parserPtr;
9 if(1==options.parser()) parserPtr=new Parser1();
10 else if(2==options.parser()) parserPtr=new Parser2();
11 else error();
12 parserPtr->Init(); //very slow
13 }
14 //do stuff
.....................
1234 }


В принципе, количество взовов оператора new больше, чем количество вызовов delete ровно на один раз. Так что утечка памяти - постоянная, не зависит от количества вызовов функции f и равняется max(sizeof(Parser1), sizeof(Parser2)).
Но все равно, совесть меня терзает за неспаренный delet-ом оператор new.
Можно ли исправить дизайн функции, не переписывая парсеры, и не
вызывая инитиализацию больше, чем надо?

★★

эээ.... вообще это плохой стиль. Очень. Тем более в С++...

есть понятие порождающей функции, к-я с-но разбирается кого из потомков конкретно надыть порождать, и возвращает указатель на вирт. базовый тип. Кто его потом делетить будет - нее праблы.

Вообще через статик пойнтеры передавать - это блин.... не надо.

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

AIv ★★★★★
()
Ответ на: комментарий от phrm

ну раньше не нулил......)))))) может счас начал?

AIv ★★★★★
()
Ответ на: комментарий от phrm

#include <iostream> using namespace std;

int main(){ double* p; p=new double; cout <<(unsigned long)p; delete p; cout <<(unsigned long)p; return 0; }

$g++ test.cpp -o test.a $./test.a 134519592134519592

gcc version 3.3.3 20040412 (ALT Linux, build 3.3.3-alt5)

уффф.. а то я уж испугался))))))

AIv ★★★★★
()

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

Отсутвие вызрова десруктора кроме утечки памяти (что фигня, если это один раз... в конце проги все одно все высвободиться) чнеревато тем что деструктор может делать всякие нужные вещи... и это может послужить источником весьма загадочных ошибок.

AIv ★★★★★
()
Ответ на: комментарий от anonymous

ну... да:-) мысль здавая, согласен:-))))

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.