Re[2]: Возвращение массива из функции
От: m.a.g. Мальта http://dottedmag.net/
Дата: 26.07.02 08:11
Оценка: 8 (1)
Здравствуйте PSP, Вы писали:

PSP>корректно будет так:


PSP>
PSP>void f(sA* & pSA, int &count)
PSP>{
PSP>  sA *pRes = new sA[nmbSA];
PSP>  pSA = pRes;
PSP>}

PSP>main()
PSP>{
PSP>  f(pSA, nmbSA);
PSP>  if(pSA)
PSP>    delete pSA;
PSP>}

PSP>


То ли я туплю? Все делают одну и ту же ошибку. Удалять надо так:
delete [] pSA;
Re[7]: Это важно в любом случае
От: Алекс Россия http://wise-orm.com
Дата: 30.07.02 08:12
Оценка: 8 (1)
Здравствуйте santucco, Вы писали:

S>Здравствуйте Алекс, Вы писали:


А>>Здравствуйте Vi2, Вы писали:


Vi2>>>Здравствуйте CAMAD, Вы писали:


А>>[]


Vi2>>>Это важно в любом случае, потому что это соответствие должно быть на уровне рефлексов! Выделил через new[], удали через delete[]. Выделил через new, удали через delete. А всю работу по оптимизации оставь компилятору — он это сделает без ошибок, в отличие от программиста!


А>>довольно наивно

S>но верно
S>такие рефлексы спасают глаза от вылезания из орбит при обнаружении memory leaks

согласен, рефлекс нужный. Можно даже в резюме писать: "Имею рефлекс удалять все массивы, выделенные new[] через delete[]".
Re[24]: Возвращение массива из функции
От: santucco  
Дата: 30.07.02 10:25
Оценка: 5 (1)
Здравствуйте Алекс, Вы писали:

А>Здравствуйте santucco, Вы писали:


S>>Здравствуйте Алекс, Вы писали:


А>>>получается vtbl распределяется отдельно от экземпляра класса? И деструктор потом грохает эту vtbl?


S>>Нет, конструктор только инициализирует указатель на УЖЕ ГОТОВУЮ vtbl. А деструктор с vtbl вообще ничего не делает

S>>Где сама vtbl хранится — зависит от компилятора. У gcc она расположена в сегменте кода, если мне не изменяет память. Если есть желание, могу взглянуть...

А>???

А>Что значит уже готовую vtbl. Из всего вышесказанного тобой я представляю такую картину:
А>
А>void* pv = malloc(sizeof(MyClass));//ни о какой vtbl и речи нет
А>MyClass* m = new(pv) MyClass;//а тут она уже появилась!
А>


А>Объясни!

Готовую vtbl — это значит, что для каждого класса компилятор создает массив указателей на виртуальные методы. Конструктор каждого класса, имеющего виртуальные методы, инициализирует указатель на vtbl указателем на vtbl, соответствующую данному классу.

Размер каждого экземпляра класса складывается из суммы размеров всех его членов-данных + возможное выравнивание + (если у класса есть хотя бы один виртуальный метод) размер указателя на vtbl (в случае множественного наследования их может быть несколько). Поэтому sizeof (MyClass) уже включает размер указателя (если MyClass имеет виртуальные методы, естественно ). Даже если класс не имеет ни одного члена-данного, но имеет хотя бы один виртуальный метод, то его размер, будет равен размеру указателя на vtbl ( для x86 — 4 байта ). Можешь проверить

P.S. Под "имеет виртуальные методы" подразумевается, что либо в классе объявлен хотя бы один виртуальный метод, либо класс наследует от класса, имеющего виртуальные методы

P.P.S. Извиняюсь за корявость объяснения
Не стреляйте в пианиста, он играет как умеет...
Возвращение массива из функции
От: LA Jazz Россия  
Дата: 25.07.02 12:37
Оценка:
typedef struct
{
int e1;
int e2;
} sA;


Как лучше осуществить возвращение массива структур sA из ф-ии:

1.
void f(sA* pSA, int* count)
{
  int nmbSA = 4;
  ...
  sA *pRes = new sA[nmbSA];
  ... // do something with array
  pSA = pRes;
  *count = nmbSA;
}

main()
{
  int nmbSA = 0;
  sA *pSA = 0;
  f(pSA, &nmbSA);
  if(pSA)
    delete pSA;
}



2.
void f(sA* pSA, int count)
{
  int nmbSA = 4;
  ...
  sA *pRes = new sA[nmbSA];
  ... // do something with array
  memcpy(pSA, pRes, sizeof(sA)*(__min(nmbSA, count))
  delete pRes;
}

main()
{
  int nmbSA = 4;
  sA *pSA = new sA[nmbSA];
  f(pSA, nmbSA);
  delete pSA;
}
Re: Возвращение массива из функции
От: Gosha Украина  
Дата: 25.07.02 12:54
Оценка:
Здравствуйте LA Jazz, Вы писали:


LJ>typedef struct

LJ>{
LJ> int e1;
LJ> int e2;
LJ>} sA;


LJ>Как лучше осуществить возвращение массива структур sA из ф-ии:


LJ>1.

LJ>
LJ>void f(sA* pSA, int* count)
LJ>{
LJ>  int nmbSA = 4;
LJ>  ...
LJ>  sA *pRes = new sA[nmbSA];
LJ>  ... // do something with array
LJ>  pSA = pRes;
LJ>  *count = nmbSA;
LJ>}

LJ>main()
LJ>{
LJ>  int nmbSA = 0;
LJ>  sA *pSA = 0;
LJ>  f(pSA, &nmbSA);
LJ>  if(pSA)
LJ>    delete pSA;
LJ>}
LJ>



LJ>2.

LJ>
LJ>void f(sA* pSA, int count)
LJ>{
LJ>  int nmbSA = 4;
LJ>  ...
LJ>  sA *pRes = new sA[nmbSA];
LJ>  ... // do something with array
LJ>  memcpy(pSA, pRes, sizeof(sA)*(__min(nmbSA, count))
LJ>  delete pRes;
LJ>}

LJ>main()
LJ>{
LJ>  int nmbSA = 4;
LJ>  sA *pSA = new sA[nmbSA];
LJ>  f(pSA, nmbSA);
LJ>  delete pSA;
LJ>}
LJ>


А почему бы и не так:
sA* f(int count)
{
    sA* pSA = new sA[count];
    if (pSA){
        ...
        // do something with array
        ...
        return pSA;
    }else
        return NULL;
}

main()
{
    int nmbSA = 4;
    sA *pSA = f(nmbSA);
    if (pSA)
        delete pSA;
}
Re: Возвращение массива из функции
От: PSP Беларусь  
Дата: 25.07.02 12:54
Оценка:
Здравствуйте LA Jazz, Вы писали:


LJ>typedef struct

LJ>{
LJ> int e1;
LJ> int e2;
LJ>} sA;


LJ>Как лучше осуществить возвращение массива структур sA из ф-ии:


LJ>1.

LJ>
LJ>void f(sA* pSA, int* count)
LJ>{
LJ>  int nmbSA = 4;
LJ>  ...
LJ>  sA *pRes = new sA[nmbSA];
LJ>  ... // do something with array
LJ>  pSA = pRes;
LJ>  *count = nmbSA;
LJ>}

LJ>main()
LJ>{
LJ>  int nmbSA = 0;
LJ>  sA *pSA = 0;
LJ>  f(pSA, &nmbSA);
LJ>  if(pSA)
LJ>    delete pSA;
LJ>}
LJ>


Этот вариант неправильный. Вообще ничего не сохранится. pSA останется равным нулю.

LJ>2.

LJ>
LJ>void f(sA* pSA, int count)
LJ>{
LJ>  int nmbSA = 4;
LJ>  ...
LJ>  sA *pRes = new sA[nmbSA];
LJ>  ... // do something with array
LJ>  memcpy(pSA, pRes, sizeof(sA)*(__min(nmbSA, count))
LJ>  delete pRes;
LJ>}

LJ>main()
LJ>{
LJ>  int nmbSA = 4;
LJ>  sA *pSA = new sA[nmbSA];
LJ>  f(pSA, nmbSA);
LJ>  delete pSA;
LJ>}
LJ>

Это тоже некорректно.

корректно будет так:

void f(sA* & pSA, int &count)
{
  int nmbSA = 4;
  ...
  sA *pRes = new sA[nmbSA];
  ... // do something with array
  pSA = pRes;
  count = nmbSA;
}

main()
{
  int nmbSA = 0;
  sA *pSA = 0;
  f(pSA, nmbSA);
  if(pSA)
    delete pSA;
}
Всегда Ваш, PSP.
Re[2]: Возвращение массива из функции
От: LA Jazz Россия  
Дата: 25.07.02 12:56
Оценка:
Здравствуйте Gosha, Вы писали:

G>А почему бы и не так:


Можно и так.
Только размер массива станет известен только в функции.
Но можно и так.
Re[3]: Возвращение массива из функции
От: Gosha Украина  
Дата: 25.07.02 13:46
Оценка:
Здравствуйте LA Jazz, Вы писали:

LJ>Можно и так.

LJ>Только размер массива станет известен только в функции.
LJ>Но можно и так.

Ну, тогда легким движеним руки ...
sA* f(int &count)
{
    sA* pSA = new sA[count];
    if (pSA){
        ...
        // do something with array
        ...
        return pSA;
    }else{
        count=0;
        return NULL;
    }
} main()
{
    int nmbSA = 4;
    sA *pSA = f(nmbSA);
    if (pSA)
        delete pSA;
}
Re[4]: Возвращение массива из функции
От: LA Jazz Россия  
Дата: 25.07.02 13:51
Оценка:
Здравствуйте Gosha, Вы писали:

Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять
указатель. Ведь так и забыть можно про удаление, а это Leaks...
Re[5]: Возвращение массива из функции
От: santucco  
Дата: 25.07.02 14:03
Оценка:
Здравствуйте LA Jazz, Вы писали:

LJ>Здравствуйте Gosha, Вы писали:


LJ>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять

LJ>указатель. Ведь так и забыть можно про удаление, а это Leaks...
Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.
Не стреляйте в пианиста, он играет как умеет...
Re[6]: Возвращение массива из функции
От: LA Jazz Россия  
Дата: 25.07.02 14:06
Оценка:
Здравствуйте santucco, Вы писали:

А как лучше вернуть массив, если заранее к-во элементов неизвестно
и не заставляя юзера delete делать?
Re[6]: Возвращение массива из функции
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 25.07.02 14:07
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте LA Jazz, Вы писали:


LJ>>Здравствуйте Gosha, Вы писали:


LJ>>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять

LJ>>указатель. Ведь так и забыть можно про удаление, а это Leaks...
S>Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.

Ну так этим и WinAPI грешит, взять хотя бы FormatMessage c его флагом FORMAT_MESSAGE_ALLOCATE_BUFFER — освобождение выделенной памяти остается на вашей совести...
Re[7]: Возвращение массива из функции
От: santucco  
Дата: 25.07.02 14:20
Оценка:
Здравствуйте LA Jazz, Вы писали:

LJ>Здравствуйте santucco, Вы писали:


LJ>А как лучше вернуть массив, если заранее к-во элементов неизвестно

LJ>и не заставляя юзера delete делать?
Выделить заведомо больше памяти, передать в функцию указатель на память и ее размер и вернуть количество элементов, положенных в массив — это классический С-шный подход

Или взять STL-реализацию массива (vector), передать его в функцию по ссылке и не мучиться
Не стреляйте в пианиста, он играет как умеет...
Re[7]: Возвращение массива из функции
От: santucco  
Дата: 25.07.02 14:22
Оценка:
Здравствуйте Flamer, Вы писали:

F>Здравствуйте santucco, Вы писали:


S>>Здравствуйте LA Jazz, Вы писали:


LJ>>>Здравствуйте Gosha, Вы писали:


LJ>>>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять

LJ>>>указатель. Ведь так и забыть можно про удаление, а это Leaks...
S>>Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.

F>Ну так этим и WinAPI грешит, взять хотя бы FormatMessage c его флагом FORMAT_MESSAGE_ALLOCATE_BUFFER — освобождение выделенной памяти остается на вашей совести...

No comments
Не стреляйте в пианиста, он играет как умеет...
Re[8]: Возвращение массива из функции
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 25.07.02 14:25
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте Flamer, Вы писали:


F>>Здравствуйте santucco, Вы писали:


S>>>Здравствуйте LA Jazz, Вы писали:


LJ>>>>Здравствуйте Gosha, Вы писали:


LJ>>>>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять

LJ>>>>указатель. Ведь так и забыть можно про удаление, а это Leaks...
S>>>Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.

F>>Ну так этим и WinAPI грешит, взять хотя бы FormatMessage c его флагом FORMAT_MESSAGE_ALLOCATE_BUFFER — освобождение выделенной памяти остается на вашей совести...

S>No comments

Не понял Что имелось в виду? Разъясните, плз..
Re[9]: Возвращение массива из функции
От: santucco  
Дата: 26.07.02 07:41
Оценка:
Здравствуйте Flamer, Вы писали:

F>Здравствуйте santucco, Вы писали:


S>>Здравствуйте Flamer, Вы писали:


F>>>Здравствуйте santucco, Вы писали:


S>>>>Здравствуйте LA Jazz, Вы писали:


LJ>>>>>Здравствуйте Gosha, Вы писали:


LJ>>>>>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять

LJ>>>>>указатель. Ведь так и забыть можно про удаление, а это Leaks...
S>>>>Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.

F>>>Ну так этим и WinAPI грешит, взять хотя бы FormatMessage c его флагом FORMAT_MESSAGE_ALLOCATE_BUFFER — освобождение выделенной памяти остается на вашей совести...

S>>No comments

F>Не понял Что имелось в виду? Разъясните, плз..

Имелось ввиду, что не стОит перенимать откровенно неудачные и потенциально опасные приемы, даже если они используются в чьем-либо API.
Не стреляйте в пианиста, он играет как умеет...
Re[10]: Возвращение массива из функции
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 26.07.02 07:45
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте Flamer, Вы писали:


F>>Здравствуйте santucco, Вы писали:


S>>>Здравствуйте Flamer, Вы писали:


F>>>>Здравствуйте santucco, Вы писали:


S>>>>>Здравствуйте LA Jazz, Вы писали:


LJ>>>>>>Здравствуйте Gosha, Вы писали:


LJ>>>>>>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять

LJ>>>>>>указатель. Ведь так и забыть можно про удаление, а это Leaks...
S>>>>>Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.

F>>>>Ну так этим и WinAPI грешит, взять хотя бы FormatMessage c его флагом FORMAT_MESSAGE_ALLOCATE_BUFFER — освобождение выделенной памяти остается на вашей совести...

S>>>No comments

F>>Не понял Что имелось в виду? Разъясните, плз..

S>Имелось ввиду, что не стОит перенимать откровенно неудачные и потенциально опасные приемы, даже если они используются в чьем-либо API.

Так я вроде как согласен с этим
Re[11]: Возвращение массива из функции
От: santucco  
Дата: 26.07.02 08:15
Оценка:
Здравствуйте Flamer, Вы писали:

F>Здравствуйте santucco, Вы писали:


S>>Здравствуйте Flamer, Вы писали:


F>>>Здравствуйте santucco, Вы писали:


S>>>>Здравствуйте Flamer, Вы писали:


F>>>>>Здравствуйте santucco, Вы писали:


S>>>>>>Здравствуйте LA Jazz, Вы писали:


LJ>>>>>>>Здравствуйте Gosha, Вы писали:


LJ>>>>>>>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять

LJ>>>>>>>указатель. Ведь так и забыть можно про удаление, а это Leaks...
S>>>>>>Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.

F>>>>>Ну так этим и WinAPI грешит, взять хотя бы FormatMessage c его флагом FORMAT_MESSAGE_ALLOCATE_BUFFER — освобождение выделенной памяти остается на вашей совести...

S>>>>No comments

F>>>Не понял Что имелось в виду? Разъясните, плз..

S>>Имелось ввиду, что не стОит перенимать откровенно неудачные и потенциально опасные приемы, даже если они используются в чьем-либо API.

F>Так я вроде как согласен с этим

Тогда дико извиняюсь за необоснованный наезд
Не стреляйте в пианиста, он играет как умеет...
Re[3]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 29.07.02 12:55
Оценка:
Здравствуйте m.a.g., Вы писали:

...>Здравствуйте PSP, Вы писали:


PSP>>корректно будет так:


PSP>>
PSP>>void f(sA* & pSA, int &count)
PSP>>{
PSP>>  sA *pRes = new sA[nmbSA];
PSP>>  pSA = pRes;
PSP>>}

PSP>>main()
PSP>>{
PSP>>  f(pSA, nmbSA);
PSP>>  if(pSA)
PSP>>    delete pSA;
PSP>>}

PSP>>


...>То ли я туплю? Все делают одну и ту же ошибку. Удалять надо так:

...>
...>delete [] pSA;
...>


...>m.a.g. — Ты единственный умный человек в этой толпе!!!

и чем народ не устраивает просто sA* p=(sA*)new sA[count];
Alex
Re[4]: Возвращение массива из функции
От: santucco  
Дата: 29.07.02 13:11
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>Здравствуйте m.a.g., Вы писали:


...>>Здравствуйте PSP, Вы писали:


PSP>>>корректно будет так:


PSP>>>
PSP>>>void f(sA* & pSA, int &count)
PSP>>>{
PSP>>>  sA *pRes = new sA[nmbSA];
PSP>>>  pSA = pRes;
PSP>>>}

PSP>>>main()
PSP>>>{
PSP>>>  f(pSA, nmbSA);
PSP>>>  if(pSA)
PSP>>>    delete pSA;
PSP>>>}

PSP>>>


...>>То ли я туплю? Все делают одну и ту же ошибку. Удалять надо так:

...>>
...>>delete [] pSA;
...>>


...>>m.a.g. — Ты единственный умный человек в этой толпе!!!

AS> и чем народ не устраивает просто sA* p=(sA*)new sA[count];
Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции
Не стреляйте в пианиста, он играет как умеет...
Re[5]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 29.07.02 13:38
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте Alex Smirnov, Вы писали:


AS>>Здравствуйте m.a.g., Вы писали:


...>>>Здравствуйте PSP, Вы писали:


PSP>>>>корректно будет так:


PSP>>>>
PSP>>>>void f(sA* & pSA, int &count)
PSP>>>>{
PSP>>>>  sA *pRes = new sA[nmbSA];
PSP>>>>  pSA = pRes;
PSP>>>>}

PSP>>>>main()
PSP>>>>{
PSP>>>>  f(pSA, nmbSA);
PSP>>>>  if(pSA)
PSP>>>>    delete pSA;
PSP>>>>}

PSP>>>>


...>>>То ли я туплю? Все делают одну и ту же ошибку. Удалять надо так:

...>>>
...>>>delete [] pSA;
...>>>


...>>>m.a.g. — Ты единственный умный человек в этой толпе!!!

AS>> и чем народ не устраивает просто sA* p=(sA*)new sA[count];
S>Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции

На то он и сокровенный!

Зачем нужно придумывать функцию простого выделения памяти
чтоб потом на продолжении долгого времени успешно искать ошибку
Alex
Re[6]: Возвращение массива из функции
От: santucco  
Дата: 29.07.02 13:54
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>Здравствуйте santucco, Вы писали:


S>>Здравствуйте Alex Smirnov, Вы писали:


AS>>> и чем народ не устраивает просто sA* p=(sA*)new sA[count];

S>>Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции

AS> На то он и сокровенный!


AS>Зачем нужно придумывать функцию простого выделения памяти

AS>чтоб потом на продолжении долгого времени успешно искать ошибку
Ну, new [] — это не простое выделение памяти, а выделение памяти под массив элементов с вызовом конструктора по умолчанию для каждого элемента массива.
delete [] соответственно вызовет деструктор для каждого элемента массива и освободит выделенную память.
Я сокровенность преобразования sA* к sA* я все-таки не понял .
Если это попытка ВНЕШНЕ (то есть для успокоения зрения )привести указатель на память под массив элементов к указателю на память под элемент, то попытка эта не только наивная, но и опасная с точки зрения утечек памяти.
И она вовсе не дает право освобождать память, выделенную new [], с помощью delete.
Не стреляйте в пианиста, он играет как умеет...
Re[7]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 29.07.02 14:11
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте Alex Smirnov, Вы писали:


AS>>Здравствуйте santucco, Вы писали:


S>>>Здравствуйте Alex Smirnov, Вы писали:


AS>>>> и чем народ не устраивает просто sA* p=(sA*)new sA[count];

S>>>Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции

AS>> На то он и сокровенный!


AS>>Зачем нужно придумывать функцию простого выделения памяти

AS>>чтоб потом на продолжении долгого времени успешно искать ошибку
S>Ну, new [] — это не простое выделение памяти, а выделение памяти под массив элементов с вызовом конструктора по умолчанию для каждого элемента массива.
S>delete [] соответственно вызовет деструктор для каждого элемента массива и освободит выделенную память.
S>Я сокровенность преобразования sA* к sA* я все-таки не понял .
S>Если это попытка ВНЕШНЕ (то есть для успокоения зрения )привести указатель на память под массив элементов к указателю на память под элемент, то попытка эта не только наивная, но и опасная с точки зрения утечек памяти.
S>И она вовсе не дает право освобождать память, выделенную new [], с помощью delete.

Ну насколько я знаю компиляторы...они не позволяют без предупреждения оставлять попытки переопределения void* к указателю на другой тип !!!
Alex
Re[3]: Возвращение массива из функции
От: CAMAD Россия  
Дата: 29.07.02 14:28
Оценка:
Здравствуйте m.a.g., Вы писали:
....
...>То ли я туплю? Все делают одну и ту же ошибку. Удалять надо так:
...>
...>delete [] pSA;
...>

Это, конечно, важно для типов с нетривиальными деструкторами. Но для встроенных типов, например, не имеет никакого значения, каким delete удалять их массив.
Re[8]: Возвращение массива из функции
От: achp  
Дата: 29.07.02 14:55
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>>>>> и чем народ не устраивает просто sA* p=(sA*)new sA[count];

S>>>>Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции

AS>>> На то он и сокровенный!


AS>>>Зачем нужно придумывать функцию простого выделения памяти

AS>>>чтоб потом на продолжении долгого времени успешно искать ошибку
S>>Ну, new [] — это не простое выделение памяти, а выделение памяти под массив элементов с вызовом конструктора по умолчанию для каждого элемента массива.
S>>delete [] соответственно вызовет деструктор для каждого элемента массива и освободит выделенную память.
S>>Я сокровенность преобразования sA* к sA* я все-таки не понял .
S>>Если это попытка ВНЕШНЕ (то есть для успокоения зрения )привести указатель на память под массив элементов к указателю на память под элемент, то попытка эта не только наивная, но и опасная с точки зрения утечек памяти.
S>>И она вовсе не дает право освобождать память, выделенную new [], с помощью delete.

AS>Ну насколько я знаю компиляторы...они не позволяют без предупреждения оставлять попытки переопределения void* к указателю на другой тип !!!


А где здесь void*?
Re[4]: Это важно в любом случае
От: Vi2 Удмуртия http://www.adem.ru
Дата: 29.07.02 15:22
Оценка:
Здравствуйте CAMAD, Вы писали:

...>>delete [] pSA;

CAMAD>Это, конечно, важно для типов с нетривиальными деструкторами. Но для встроенных типов, например, не имеет никакого значения, каким delete удалять их массив.

Это важно в любом случае, потому что это соответствие должно быть на уровне рефлексов! Выделил через new[], удали через delete[]. Выделил через new, удали через delete. А всю работу по оптимизации оставь компилятору — он это сделает без ошибок, в отличие от программиста!
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[9]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 29.07.02 15:22
Оценка:
Здравствуйте achp, Вы писали:

A>Здравствуйте Alex Smirnov, Вы писали:


AS>>>>>> и чем народ не устраивает просто sA* p=(sA*)new sA[count];

S>>>>>Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции

AS>>>> На то он и сокровенный!


AS>>>>Зачем нужно придумывать функцию простого выделения памяти

AS>>>>чтоб потом на продолжении долгого времени успешно искать ошибку
S>>>Ну, new [] — это не простое выделение памяти, а выделение памяти под массив элементов с вызовом конструктора по умолчанию для каждого элемента массива.
S>>>delete [] соответственно вызовет деструктор для каждого элемента массива и освободит выделенную память.
S>>>Я сокровенность преобразования sA* к sA* я все-таки не понял .
S>>>Если это попытка ВНЕШНЕ (то есть для успокоения зрения )привести указатель на память под массив элементов к указателю на память под элемент, то попытка эта не только наивная, но и опасная с точки зрения утечек памяти.
S>>>И она вовсе не дает право освобождать память, выделенную new [], с помощью delete.

AS>>Ну насколько я знаю компиляторы...они не позволяют без предупреждения оставлять попытки переопределения void* к указателю на другой тип !!!


A>А где здесь void*?


..> achp>> Это просто трёп? или вопрос на самом деле?
Alex
Re[10]: Возвращение массива из функции
От: santucco  
Дата: 29.07.02 16:11
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>Здравствуйте achp, Вы писали:


A>>Здравствуйте Alex Smirnov, Вы писали:


AS>>>>>>> и чем народ не устраивает просто sA* p=(sA*)new sA[count];

S>>>>>>Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции

AS>>>>> На то он и сокровенный!


AS>>>>>Зачем нужно придумывать функцию простого выделения памяти

AS>>>>>чтоб потом на продолжении долгого времени успешно искать ошибку
S>>>>Ну, new [] — это не простое выделение памяти, а выделение памяти под массив элементов с вызовом конструктора по умолчанию для каждого элемента массива.
S>>>>delete [] соответственно вызовет деструктор для каждого элемента массива и освободит выделенную память.
S>>>>Я сокровенность преобразования sA* к sA* я все-таки не понял .
S>>>>Если это попытка ВНЕШНЕ (то есть для успокоения зрения )привести указатель на память под массив элементов к указателю на память под элемент, то попытка эта не только наивная, но и опасная с точки зрения утечек памяти.
S>>>>И она вовсе не дает право освобождать память, выделенную new [], с помощью delete.

AS>>>Ну насколько я знаю компиляторы...они не позволяют без предупреждения оставлять попытки переопределения void* к указателю на другой тип !!!


A>>А где здесь void*?


..>> achp>> Это просто трёп? или вопрос на самом деле?

Я думаю, что вопрос. Мне тоже интересно, где тут void* нашелся
Не стреляйте в пианиста, он играет как умеет...
Re[5]: Это важно в любом случае
От: Алекс Россия http://wise-orm.com
Дата: 30.07.02 04:13
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте CAMAD, Вы писали:


[]

Vi2>Это важно в любом случае, потому что это соответствие должно быть на уровне рефлексов! Выделил через new[], удали через delete[]. Выделил через new, удали через delete. А всю работу по оптимизации оставь компилятору — он это сделает без ошибок, в отличие от программиста!


довольно наивно
Re[4]: Возвращение массива из функции
От: Андрей Тарасевич Беларусь  
Дата: 30.07.02 05:15
Оценка:
Здравствуйте CAMAD, Вы писали:

CAMAD>Здравствуйте m.a.g., Вы писали:

CAMAD>....
...>>То ли я туплю? Все делают одну и ту же ошибку. Удалять надо так:
...>>
...>>delete [] pSA;
...>>

CAMAD>Это, конечно, важно для типов с нетривиальными деструкторами. Но для встроенных типов, например, не имеет никакого значения, каким delete удалять их массив.

И из чего же это следует?
Best regards,
Андрей Тарасевич
Re[5]: Возвращение массива из функции
От: CAMAD Россия  
Дата: 30.07.02 05:40
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>И из чего же это следует?


А это следует например из очевидной примитивности кода деструктора для встроенного типа.
Re[11]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 30.07.02 06:11
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте Alex Smirnov, Вы писали:


AS>>Здравствуйте achp, Вы писали:


A>>>Здравствуйте Alex Smirnov, Вы писали:


AS>>>>>>>> и чем народ не устраивает просто sA* p=(sA*)new sA[count];

S>>>>>>>Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции

AS>>>>>> На то он и сокровенный!


AS>>>>>>Зачем нужно придумывать функцию простого выделения памяти

AS>>>>>>чтоб потом на продолжении долгого времени успешно искать ошибку
S>>>>>Ну, new [] — это не простое выделение памяти, а выделение памяти под массив элементов с вызовом конструктора по умолчанию для каждого элемента массива.
S>>>>>delete [] соответственно вызовет деструктор для каждого элемента массива и освободит выделенную память.
S>>>>>Я сокровенность преобразования sA* к sA* я все-таки не понял .
S>>>>>Если это попытка ВНЕШНЕ (то есть для успокоения зрения )привести указатель на память под массив элементов к указателю на память под элемент, то попытка эта не только наивная, но и опасная с точки зрения утечек памяти.
S>>>>>И она вовсе не дает право освобождать память, выделенную new [], с помощью delete.

AS>>>>Ну насколько я знаю компиляторы...они не позволяют без предупреждения оставлять попытки переопределения void* к указателю на другой тип !!!


A>>>А где здесь void*?


..>>> achp>> Это просто трёп? или вопрос на самом деле?

S>Я думаю, что вопрос. Мне тоже интересно, где тут void* нашелся

ДЛЯ achp и santucco популярно!!! Оператор new ВСЕГДА!!! возвращает void*
Alex
Re[12]: Возвращение массива из функции
От: achp  
Дата: 30.07.02 06:42
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS> ДЛЯ achp и santucco популярно!!! Оператор new ВСЕГДА!!! возвращает void*


Новатор?
Шутник?
Крутой?
Re[13]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 30.07.02 07:06
Оценка:
Здравствуйте achp, Вы писали:

A>Здравствуйте Alex Smirnov, Вы писали:


AS>> ДЛЯ achp и santucco популярно!!! Оператор new ВСЕГДА!!! возвращает void*


A>Новатор?

A>Шутник?
A>Крутой?

fchp-> неплохо было бы перечитать учебник по С++
Alex
Re[14]: Возвращение массива из функции
От: achp  
Дата: 30.07.02 07:10
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>Здравствуйте achp, Вы писали:


A>>Здравствуйте Alex Smirnov, Вы писали:


AS>>> ДЛЯ achp и santucco популярно!!! Оператор new ВСЕГДА!!! возвращает void*


A>>Новатор?

A>>Шутник?
A>>Крутой?

fchp->> неплохо было бы перечитать учебник по С++


Ну так перечитай!
Re[15]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 30.07.02 07:17
Оценка:
Здравствуйте achp, Вы писали:

A>Здравствуйте Alex Smirnov, Вы писали:


AS>>Здравствуйте achp, Вы писали:


A>>>Здравствуйте Alex Smirnov, Вы писали:


AS>>>> ДЛЯ achp и santucco популярно!!! Оператор new ВСЕГДА!!! возвращает void*


A>>>Новатор?

A>>>Шутник?
A>>>Крутой?

fchp->>> неплохо было бы перечитать учебник по С++


A>Ну так перечитай!


achp! Повежливей надо быть!!! И не спорить о вещах в которых мало разбираешся
Alex
Re[15]: Возвращение массива из функции
От: LA Jazz Россия  
Дата: 30.07.02 07:18
Оценка:
Здравствуйте achp, Вы писали:

A>Ну так перечитай!


Мне кажется, что как раз тебе и надо перечитать заново. А там написано вот что:
void* operator new(size_t)
void operator delete(void *)

void* operator new[](size_t)
void operator delete[](void *)
Re[16]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 30.07.02 07:31
Оценка:
Здравствуйте LA Jazz, Вы писали:

А Вы не пробывали организовать работу с массивом через так называемые Smart Pointers....Тогда и юзеру действительно не надо будет заботится о delete[] ???
Alex
Re[17]: Возвращение массива из функции
От: LA Jazz Россия  
Дата: 30.07.02 07:34
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

На самом деле я уже организовал возвращение через итератор
и через функцию GetNext(...) своего класса.
Re[16]: Возвращение массива из функции
От: santucco  
Дата: 30.07.02 07:36
Оценка:
Здравствуйте LA Jazz, Вы писали:

LJ>Здравствуйте achp, Вы писали:


A>>Ну так перечитай!


LJ>Мне кажется, что как раз тебе и надо перечитать заново. А там написано вот что:

LJ>void* operator new(size_t)
LJ>void operator delete(void *)

LJ>void* operator new[](size_t)

LJ>void operator delete[](void *)
Народ, вы не с луны, случайно?
То, что ты привел в качестве примера — это ОПЕРАТОР new и ОПЕРАТОР delete. ОПЕРАТОР new вызываeтся ФУНКЦИЕЙ new для выделения нужного куска СЫРОЙ памяти — поэтому она и возвращает void*. Затем ФУНКЦИЯ new вызывает конструктор для полученного куска сырой памяти.
ФУНКЦИЯ delete вызывает деструктор и ОПЕРАТОР delete для освобождения памяти.
Перегружая ОПЕРАТОРЫ new и delete можно реализовать свою стратегию выделения и освобождения памяти, но они работают с СЫРОЙ памятью, поэтому используют void*.
Есть еще одна форма вызова ФУНКЦИИ new — можно передать ей указатель уже выделенный кусок памяти о она только вызовет конструктор для него

    sA* Object = new ( Buffer ) sA ( ... );
Не стреляйте в пианиста, он играет как умеет...
Re[16]: Возвращение массива из функции
От: achp  
Дата: 30.07.02 07:54
Оценка:
Здравствуйте LA Jazz, Вы писали:

LJ>Здравствуйте achp, Вы писали:


A>>Ну так перечитай!


LJ>Мне кажется, что как раз тебе и надо перечитать заново. А там написано вот что:

LJ>void* operator new(size_t)
LJ>void operator delete(void *)

LJ>void* operator new[](size_t)

LJ>void operator delete[](void *)

См. ответ мсье Смирнову.
Re[17]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 30.07.02 08:05
Оценка:
Здравствуйте achp, Вы писали:

A>Здравствуйте LA Jazz, Вы писали:


LJ>>Здравствуйте achp, Вы писали:


A>>>Ну так перечитай!


LJ>>Мне кажется, что как раз тебе и надо перечитать заново. А там написано вот что:

LJ>>void* operator new(size_t)
LJ>>void operator delete(void *)

LJ>>void* operator new[](size_t)

LJ>>void operator delete[](void *)

A>См. ответ мсье Смирнову.


А ВАМ стоит посмотреть исходники!!! Там черным по белому:
void * operator new( size_t cb )
{
void *res = _nh_malloc( cb, 1 );

RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));

return res;
}
А malloc() и её инкарнации ВСЕГДА возвращали void*. И было бы глупо возвращать что то иное!!!
Alex
Re[6]: Это важно в любом случае
От: santucco  
Дата: 30.07.02 08:05
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте Vi2, Вы писали:


Vi2>>Здравствуйте CAMAD, Вы писали:


А>[]


Vi2>>Это важно в любом случае, потому что это соответствие должно быть на уровне рефлексов! Выделил через new[], удали через delete[]. Выделил через new, удали через delete. А всю работу по оптимизации оставь компилятору — он это сделает без ошибок, в отличие от программиста!


А>довольно наивно

но верно
такие рефлексы спасают глаза от вылезания из орбит при обнаружении memory leaks
Не стреляйте в пианиста, он играет как умеет...
Re[17]: Возвращение массива из функции
От: Алекс Россия http://wise-orm.com
Дата: 30.07.02 08:10
Оценка:
Здравствуйте santucco, Вы писали:

[]

S>Есть еще одна форма вызова ФУНКЦИИ new — можно передать ей указатель уже выделенный кусок памяти о она только вызовет конструктор для него


S>
S>    sA* Object = new ( Buffer ) sA ( ... );
S>



Не понял. Какой конструктор может быть у уже выделенного куска памяти? Ты хочешь сказать, можно создать экземпляр какого-либо класса и при этом не вызвать конструктор?
Re[18]: Возвращение массива из функции
От: SergInc  
Дата: 30.07.02 08:14
Оценка:
void* p;
int* i = p; // тут компилятор ругается

В то же время
int* i = new int; // нормально

Или:

cout << *(new int(3)); // нормально

Это не смущает утверждающих, что new возвращает именно void*?
Re[18]: Возвращение массива из функции
От: santucco  
Дата: 30.07.02 08:25
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте santucco, Вы писали:


А>[]


S>>Есть еще одна форма вызова ФУНКЦИИ new — можно передать ей указатель уже выделенный кусок памяти о она только вызовет конструктор для него


S>>
S>>    sA* Object = new ( Buffer ) sA ( ... );
S>>



А>Не понял. Какой конструктор может быть у уже выделенного куска памяти? Ты хочешь сказать, можно создать экземпляр какого-либо класса и при этом не вызвать конструктор?

Попробую объяснить популярно...
Пори создании объекта в динамической памяти выполняются две вещи: 1)выделение куска памяти, достаточного для размещения объекта; 2) инициализация этого куска памяти с помощью конструктора класса.

Обычная форма функции new вызывает operator new для выделения куска памати и затем вызывает конструктор класса, который инициализирует этот кусок памяти.

Форма функции new, которую я описал, просто вызывает конструктор для инициализации переданного ей куска памяти.
Не стреляйте в пианиста, он играет как умеет...
Re[18]: Возвращение массива из функции
От: santucco  
Дата: 30.07.02 08:27
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>Здравствуйте achp, Вы писали:


A>>Здравствуйте LA Jazz, Вы писали:


LJ>>>Здравствуйте achp, Вы писали:


A>>>>Ну так перечитай!


LJ>>>Мне кажется, что как раз тебе и надо перечитать заново. А там написано вот что:

LJ>>>void* operator new(size_t)
LJ>>>void operator delete(void *)

LJ>>>void* operator new[](size_t)

LJ>>>void operator delete[](void *)

A>>См. ответ мсье Смирнову.


AS>А ВАМ стоит посмотреть исходники!!! Там черным по белому:

AS>void * operator new( size_t cb )
AS>{
AS> void *res = _nh_malloc( cb, 1 );

AS> RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));


AS> return res;

AS>}
AS> А malloc() и её инкарнации ВСЕГДА возвращали void*. И было бы глупо возвращать что то иное!!!
Молодой человек, Вы смотрите исходники перегруженного ОПЕРАТОРА new. Это всего-навсего реализация стратегии выделения памяти.
Не стреляйте в пианиста, он играет как умеет...
Re[19]: Возвращение массива из функции
От: Алекс Россия http://wise-orm.com
Дата: 30.07.02 08:34
Оценка:
Здравствуйте santucco, Вы писали:

хъ

S>Попробую объяснить популярно...

S>Пори создании объекта в динамической памяти выполняются две вещи: 1)выделение куска памяти, достаточного для размещения объекта; 2) инициализация этого куска памяти с помощью конструктора класса.

S>Обычная форма функции new вызывает operator new для выделения куска памати и затем вызывает конструктор класса, который инициализирует этот кусок памяти.


S>Форма функции new, которую я описал, просто вызывает конструктор для инициализации переданного ей куска памяти.


Это все понятно, а как быть если класс имеет виртуальные функции?
Re[20]: Возвращение массива из функции
От: santucco  
Дата: 30.07.02 08:39
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте santucco, Вы писали:


А>хъ


S>>Попробую объяснить популярно...

S>>Пори создании объекта в динамической памяти выполняются две вещи: 1)выделение куска памяти, достаточного для размещения объекта; 2) инициализация этого куска памяти с помощью конструктора класса.

S>>Обычная форма функции new вызывает operator new для выделения куска памати и затем вызывает конструктор класса, который инициализирует этот кусок памяти.


S>>Форма функции new, которую я описал, просто вызывает конструктор для инициализации переданного ей куска памяти.


А>Это все понятно, а как быть если класс имеет виртуальные функции?

А в чем проблема?
Наличие виртуальных функций подразумевает наличие указателя на vtbl.
Инициализацией этого указателя занимается конструктор ( на самом деле, конструктор делает гораздо больше действий, чем написано в коде cpp'шном коде конструктора ).
Не стреляйте в пианиста, он играет как умеет...
Re[19]: Возвращение массива из функции
От: Alex Smirnov Россия  
Дата: 30.07.02 08:45
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте Alex Smirnov, Вы писали:


AS>>Здравствуйте achp, Вы писали:


A>>>Здравствуйте LA Jazz, Вы писали:


LJ>>>>Здравствуйте achp, Вы писали:


A>>>>>Ну так перечитай!


LJ>>>>Мне кажется, что как раз тебе и надо перечитать заново. А там написано вот что:

LJ>>>>void* operator new(size_t)
LJ>>>>void operator delete(void *)

LJ>>>>void* operator new[](size_t)

LJ>>>>void operator delete[](void *)


A>>>См. ответ мсье Смирнову.


AS>>А ВАМ стоит посмотреть исходники!!! Там черным по белому:

AS>>void * operator new( size_t cb )
AS>>{
AS>> void *res = _nh_malloc( cb, 1 );

AS>> RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));


AS>> return res;

AS>>}
AS>> А malloc() и её инкарнации ВСЕГДА возвращали void*. И было бы глупо возвращать что то иное!!!
S>Молодой человек, Вы смотрите исходники перегруженного ОПЕРАТОРА new. Это всего-навсего реализация стратегии выделения памяти.

Уважаемый пианист! прочитайте свой девиз(подпись) несколько раз! может это ВАМ поможет! И можно наверно прекратить этот бестолковый базар.
Alex
Re[20]: Возвращение массива из функции
От: santucco  
Дата: 30.07.02 08:50
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>Здравствуйте santucco, Вы писали:


S>>Здравствуйте Alex Smirnov, Вы писали:


AS>>>Здравствуйте achp, Вы писали:


A>>>>Здравствуйте LA Jazz, Вы писали:


LJ>>>>>Здравствуйте achp, Вы писали:


A>>>>>>Ну так перечитай!


LJ>>>>>Мне кажется, что как раз тебе и надо перечитать заново. А там написано вот что:

LJ>>>>>void* operator new(size_t)
LJ>>>>>void operator delete(void *)

LJ>>>>>void* operator new[](size_t)

LJ>>>>>void operator delete[](void *)


A>>>>См. ответ мсье Смирнову.


AS>>>А ВАМ стоит посмотреть исходники!!! Там черным по белому:

AS>>>void * operator new( size_t cb )
AS>>>{
AS>>> void *res = _nh_malloc( cb, 1 );

AS>>> RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));


AS>>> return res;

AS>>>}
AS>>> А malloc() и её инкарнации ВСЕГДА возвращали void*. И было бы глупо возвращать что то иное!!!
S>>Молодой человек, Вы смотрите исходники перегруженного ОПЕРАТОРА new. Это всего-навсего реализация стратегии выделения памяти.

AS>Уважаемый пианист! прочитайте свой девиз(подпись) несколько раз! может это ВАМ поможет! И можно наверно прекратить этот бестолковый базар.

Пациент скорее мертв, чем жив...
Это печально
Не стреляйте в пианиста, он играет как умеет...
Re[21]: Возвращение массива из функции
От: Алекс Россия http://wise-orm.com
Дата: 30.07.02 08:51
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте Алекс, Вы писали:


А>>Здравствуйте santucco, Вы писали:


А>>хъ


S>>>Попробую объяснить популярно...

S>>>Пори создании объекта в динамической памяти выполняются две вещи: 1)выделение куска памяти, достаточного для размещения объекта; 2) инициализация этого куска памяти с помощью конструктора класса.

S>>>Обычная форма функции new вызывает operator new для выделения куска памати и затем вызывает конструктор класса, который инициализирует этот кусок памяти.


S>>>Форма функции new, которую я описал, просто вызывает конструктор для инициализации переданного ей куска памяти.


А>>Это все понятно, а как быть если класс имеет виртуальные функции?

S>А в чем проблема?
S>Наличие виртуальных функций подразумевает наличие указателя на vtbl.
S>Инициализацией этого указателя занимается конструктор ( на самом деле, конструктор делает гораздо больше действий, чем написано в коде cpp'шном коде конструктора ).

получается vtbl распределяется отдельно от экземпляра класса? И деструктор потом грохает эту vtbl?
Re[22]: Возвращение массива из функции
От: santucco  
Дата: 30.07.02 08:58
Оценка:
Здравствуйте Алекс, Вы писали:

А>получается vtbl распределяется отдельно от экземпляра класса? И деструктор потом грохает эту vtbl?


Нет, конструктор только инициализирует указатель на УЖЕ ГОТОВУЮ vtbl. А деструктор с vtbl вообще ничего не делает
Где сама vtbl хранится — зависит от компилятора. У gcc она расположена в сегменте кода, если мне не изменяет память. Если есть желание, могу взглянуть...
Не стреляйте в пианиста, он играет как умеет...
Re[23]: Возвращение массива из функции
От: Алекс Россия http://wise-orm.com
Дата: 30.07.02 09:07
Оценка:
Здравствуйте santucco, Вы писали:

S>Здравствуйте Алекс, Вы писали:


А>>получается vtbl распределяется отдельно от экземпляра класса? И деструктор потом грохает эту vtbl?


S>Нет, конструктор только инициализирует указатель на УЖЕ ГОТОВУЮ vtbl. А деструктор с vtbl вообще ничего не делает

S>Где сама vtbl хранится — зависит от компилятора. У gcc она расположена в сегменте кода, если мне не изменяет память. Если есть желание, могу взглянуть...

???
Что значит уже готовую vtbl. Из всего вышесказанного тобой я представляю такую картину:
void* pv = malloc(sizeof(MyClass));//ни о какой vtbl и речи нет
MyClass* m = new(pv) MyClass;//а тут она уже появилась!


Объясни!
Re[4]: Возвращение массива из функции
От: m.a.g. Мальта http://dottedmag.net/
Дата: 30.07.02 09:57
Оценка:
Здравствуйте CAMAD, Вы писали:

CAMAD>Здравствуйте m.a.g., Вы писали:

CAMAD>....
...>>То ли я туплю? Все делают одну и ту же ошибку. Удалять надо так:
...>>
...>>delete [] pSA;
...>>

CAMAD>Это, конечно, важно для типов с нетривиальными деструкторами. Но для встроенных типов, например, не имеет никакого значения, каким delete удалять их массив.

Покажи мне цитату стандарта, в которой это сказано. А если не найдешь — подумай, одним ли MSVC++ ограничивается мир компиляторов.
Re[6]: Возвращение массива из функции
От: m.a.g. Мальта http://dottedmag.net/
Дата: 30.07.02 10:03
Оценка:
Здравствуйте CAMAD, Вы писали:

CAMAD>Здравствуйте Андрей Тарасевич, Вы писали:


АТ>>И из чего же это следует?


CAMAD>А это следует например из очевидной примитивности кода деструктора для встроенного типа.


Только вот из этой примитивности не следует то, что освободится именно нужный кусок памяти.
Придумать можно сколько угодно способов организации кучи, в том числе и таких, для который
разница между delete и delete[] будет жизненно важна.
Re[25]: Возвращение массива из функции
От: Алекс Россия http://wise-orm.com
Дата: 30.07.02 10:32
Оценка:
Здравствуйте santucco, Вы писали:

[]

S>P.P.S. Извиняюсь за корявость объяснения


до меня все же дошло
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.