Как лучше осуществить возвращение массива структур 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;
}
Здравствуйте LA Jazz, Вы писали:
LJ>Здравствуйте Gosha, Вы писали:
LJ>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять LJ>указатель. Ведь так и забыть можно про удаление, а это Leaks...
Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.
Здравствуйте santucco, Вы писали:
S>Здравствуйте LA Jazz, Вы писали:
LJ>>Здравствуйте Gosha, Вы писали:
LJ>>Но тогда возникает другой вопрос: этично ли заставлять пользователя удалять LJ>>указатель. Ведь так и забыть можно про удаление, а это Leaks... S>Ну, откровенно говоря, возврат указателя на выделенную внутри функции памать — потенциальный memory leak, как бы он не возвращался — через в параметры или через возвращаемое значение )). User обязательно забудет вызвать delete для этой памяти.
Ну так этим и WinAPI грешит, взять хотя бы FormatMessage c его флагом FORMAT_MESSAGE_ALLOCATE_BUFFER — освобождение выделенной памяти остается на вашей совести...
Здравствуйте LA Jazz, Вы писали:
LJ>Здравствуйте santucco, Вы писали:
LJ>А как лучше вернуть массив, если заранее к-во элементов неизвестно LJ>и не заставляя юзера delete делать?
Выделить заведомо больше памяти, передать в функцию указатель на память и ее размер и вернуть количество элементов, положенных в массив — это классический С-шный подход
Или взять STL-реализацию массива (vector), передать его в функцию по ссылке и не мучиться
Здравствуйте 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
Здравствуйте 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
Здравствуйте 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.
Здравствуйте 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.
Здравствуйте 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>Так я вроде как согласен с этим
Тогда дико извиняюсь за необоснованный наезд
Здравствуйте 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];
Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции
Здравствуйте 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 Smirnov, Вы писали:
AS>Здравствуйте santucco, Вы писали:
S>>Здравствуйте Alex Smirnov, Вы писали:
AS>>> и чем народ не устраивает просто sA* p=(sA*)new sA[count]; S>>Я дико извиняюсь за собственную тупость — но я не понял сокровенного смысла этой конструкции
AS> На то он и сокровенный!
AS>Зачем нужно придумывать функцию простого выделения памяти AS>чтоб потом на продолжении долгого времени успешно искать ошибку
Ну, new [] — это не простое выделение памяти, а выделение памяти под массив элементов с вызовом конструктора по умолчанию для каждого элемента массива.
delete [] соответственно вызовет деструктор для каждого элемента массива и освободит выделенную память.
Я сокровенность преобразования sA* к sA* я все-таки не понял .
Если это попытка ВНЕШНЕ (то есть для успокоения зрения )привести указатель на память под массив элементов к указателю на память под элемент, то попытка эта не только наивная, но и опасная с точки зрения утечек памяти.
И она вовсе не дает право освобождать память, выделенную new [], с помощью delete.