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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.