LINUX.ORG.RU

Вопрос про new и delete.


0

0

Доброе время суток!
Столкнулся с небольшой проблемой при использовании операторой new() и delete() в C++.

Для начала, пример кода на C:

struct struct_t {
....
char data[];
};

struct struct_t *function()
{
struct struct_t *s;
....
/* Вычислили размер data. */
s = malloc(sizeof(struct struct_t) + datasize);
return s;
}
....

/* Освобождаем память. */
free(s);


Внимание вопрос: как то же самое написать на C++? У меня возникла сложность с тем, что единственный известный мне подходящий способ выделения памяти выглядит так:

s = (struct_t) new char [sizeof(struct_t) + datasize);
Т.е. я выделяю память под массив байт. Но в этом случае ее и освобождать нужно как
delete [] s
а хотелось бы просто delete s....

Может кто чего подскажет? :)


s = new struct_t();
delete s;
;)

sS ★★★★★
()

Так сделать нельзя :), т.к. РАЗМЕР У СТРУКТУРЫ ПЕРЕМЕННЫЙ (т.е. сколько мне нужно я вычилсяю во время выполнения программы).

syomin
() автор топика

значит это не структура а указатель на область памяти

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

Нашел таки оригинал

2syomin 
>Так сделать нельзя :), т.к. РАЗМЕР У СТРУКТУРЫ ПЕРЕМЕННЫЙ (т.е. сколько мне нужно я вычилсяю во время выполнения программы).

То что ты делаешь - это типичный сёвый подход в ++ же
так не делают для этого  там есть другие методы 
Либо переходи полностью на ++ либо оставайся в plain C

Смешение стилей есть плохой тон ...


sS ★★★★★
()

Нашел таки оригинал

BTW насчет нельзя:

#include <iostream.h>

struct struct_t {
int n,a,b,c;

struct_t(int i);
~struct_t();

char& operator [](int i){
if(i<n)
return data[i];
else
throw this;
}

private:
char* data;
};

struct_t::struct_t(int i) {
n = i;
data = new char[n];
}

struct_t::~struct_t() {
delete [] data;
}

int main(int argc, char** argv)
{
struct_t* A;
int i;
A = new struct_t(10);

cout << "Enter index (<10):";
try {
cin >> i;
(*A)[i] = (char)(i);
cout << "A[" << i << "]=" << (*A)[i] << "\n";
} catch (struct_t*) {
cout << "Bad index " << i << "\n";
}
delete A;
return 0;
};

;)))

hint: правильные структуры в ++ называются class ;)

sS ★★★★★
()

2 syomin.
Делать можно также как и на си, т.е. с использованием malloc/free. Есть только 2 отличия:

1) Слово struct писать нужно только при объявлении структуры. Т.е.
struct struct_t *function() {
struct struct_t *s;
...
}

будет выглядеть так:
struct_t *function() {
struct_t *s;
...
}

2) Требуется явное приведение типа от void *. Т.е. вместо
s = malloc(...);

будет так:
s = (struct_t *)malloc(...);


2 sS (*) (2003-08-11 20:25:07.465637).
> То что ты делаешь - это типичный сёвый подход в ++ же
> так не делают для этого там есть другие методы
> Либо переходи полностью на ++ либо оставайся в plain C
> Смешение стилей есть плохой тон ...
Это все просто слова. Религия какая-то.


2 sS (*) (2003-08-11 20:57:19.470049).
Вот из-за такого кода и возникают недоразумения о том, что использование си++ имеет следствием дополнительные накладные расходы на время выполнения по сравнению с си. Вместо одного вызова malloc у тебя их два (new -- та же самая malloc по сути). А вызов malloc стоит дорого. На кой ляд делать их два, если можно с тем же успехом обойтись одним? Из-за религиозных предубеждений?

nobody ★★
()

Нашел таки оригинал

2nobody

2 sS (*) (2003-08-11 20:25:07.465637).
> То что ты делаешь - это типичный сёвый подход в ++ же
> так не делают для этого там есть другие методы
> Либо переходи полностью на ++ либо оставайся в plain C
> Смешение стилей есть плохой тон ...

>Это все просто слова. Религия какая-то.

Почему религия ? Ты таки определись на чем ты хош
писать на С или на ++. Зачем вообще нужны ++ при С-style коде ?
А потом кричат что ++ отстой.

BTW: Код что ты привел это вообще 100% С

>2 sS (*) (2003-08-11 20:57:19.470049).
>Вот из-за такого кода и возникают недоразумения о том, что >использование си++ имеет следствием дополнительные накладные >расходы на время выполнения по сравнению с си. Вместо одного >вызова malloc у тебя их два (new -- та же самая malloc по сути). А >вызов malloc стоит дорого. На кой ляд делать их два, если можно с >тем же успехом обойтись одним?

>Из-за религиозных предубеждений?

Из соображений здравого смысла

Если у тебя происходит мульен маллоков в секунду то это
ImHO дефект общей архитектуры твоей системы тут
что 1млн что 2млн все равно будут тормоза

А если идет выбор между 1 или 2 малоками за все время исполнения
то какая нафиг разница....

BTW: В качестве домашнего задания собери мой пример с опцией -g и в gdb выясни в ней количество вызовов malloc ;)


sS ★★★★★
()

Кстати, насчёт плюсовый/неплюсовый подход -- лень думать, но убеждён, что с помощью переопределения operator new сие сделать можно. И вполне в плюсовом стиле.

С уважением -- Смоляное Чучелко

anonymous
()

> с помощью переопределения operator new сие сделать можно
Неа. Когда ты делаешь

ptr = new type;

компилятор вызывает

ptr = operator_new(sizeof(type));

и, если есть конструктор, то

ptr->type();

Так вот, закорючка тут в sizeof(type), поскольку размер структуры переменный, и на этапе компиляции не известен.

> насчёт плюсовый/неплюсовый подход
Какая разница-то, оператор new или функция malloc? Конструктора-то все равно у структуры нет (также как и деструктора, поэтому можно после malloc смело вызывать free).
И вообще, насчет подхода, непонятно это у вас с sS табу что ли на использование функций libc в си++, или как?

nobody ★★
()

а не проще сделать char *data , а потом в конструкторе структуры ( пишем же на плюсах ) выделять сколько надо? Зачем кривые способы?

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