3) Только на С++ так писать не модно. Модно какую-нибудь библиотеку куонтейнеров использовать. За неимением лучшей можно использовать STL, например.
Скажем так:
typedef std::vector<int> TLine;
TLine line( 0, Range3 );
typedef std::vector<TLine> TMatrix;
TMatrix matrix( line, Range2 );
// и т. д.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Sni4ok, Вы писали:
S>а никак- ибо приведённый код уже не удовлетворяет базовой гарантии, поэтому можете и не рыпаться.
1) с хамской формой ответа
2) Вообщето спрашивали о том, как память освободить, а не о гарантиях (видимо exception safety)...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, piero_, Вы писали:
_>как освободить память, если у меня 4-мерный динамический массив, выделяю память я так:
_> int **** Grid11; _> int Range1, Range2;
_> Grid11 = new int***[Range1]; _> for(i1 = 0; i1 < Range1; i1++) _> {Grid11[i1] = new int**[Range1]; _> for(i2 = 0; i2 < Range1; i2++) _> {Grid11[i1][i2] = new int*[Range2]; _> for(i3 = 0; i3 < Range2; i3++) _> {Grid11[i1][i2][i3] = new int[Range2]; _> memset(Grid11[i1][i2][i3],0, sizeof(int)*(Range2)); _> } _> } _> }
_>Спасибо
Ответ Егора хочу дополнить подсказкой. Если в этом примере использовать класс std::vector из стандартной библиотеки, то забота об освобождении памти отпадает автоматически:
При выходе из функции main память, выделенная для объектов Grid11 и Grid22, будет освобождена автоматически. Кроме того, твой код приобрет устойчивость по отношению к возможным исключениям — память освободится даже в этом случае. И, что очень важно, сравни эти два варианта кода, какой из них легче прочитать и проще понять?
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Динамические массивы, освобождение памяти
От:
Аноним
Дата:
16.02.08 16:12
Оценка:
спасибо за ответы, постараюсь учесть ваши замечания
Если не поможет, будем действовать током... 600 Вольт (C)
Re[2]: Динамические массивы, освобождение памяти
От:
Аноним
Дата:
17.02.08 11:06
Оценка:
Здравствуйте, rg45, Вы писали:
R>Ответ Егора хочу дополнить подсказкой. Если в этом примере использовать класс std::vector из стандартной библиотеки, то забота об освобождении памти отпадает автоматически: R>
R>При выходе из функции main память, выделенная для объектов Grid11 и Grid22, будет освобождена автоматически. Кроме того, твой код приобрет устойчивость по отношению к возможным исключениям — память освободится даже в этом случае. И, что очень важно, сравни эти два варианта кода, какой из них легче прочитать и проще понять?
Я сделал как вы сказали, но не могу обратиться к элементу Grid11[0][0][0][0]
дебагер говорит "2382 Side effects are not allowed"
??? в чем может быть ошибка?
Здравствуйте, <Аноним>, Вы писали:
А>Я сделал как вы сказали, но не могу обратиться к элементу Grid11[0][0][0][0] А>дебагер говорит "2382 Side effects are not allowed" А>??? в чем может быть ошибка?
Где отображается сообщение: "2382 Side effects are not allowed"? Правильно я понимаю, что программа компилируется и запускается, но не получается увидеть значение Grid11[0][0][0][0] при прассировке программы в отлдадчике?
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, <Аноним>, Вы писали:
А>>Я сделал как вы сказали, но не могу обратиться к элементу Grid11[0][0][0][0] А>>дебагер говорит "2382 Side effects are not allowed" А>>??? в чем может быть ошибка?
R>Где отображается сообщение: "2382 Side effects are not allowed"? Правильно я понимаю, что программа компилируется и запускается, но не получается увидеть значение Grid11[0][0][0][0] при прассировке программы в отлдадчике?
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, <Аноним>, Вы писали:
А>>Здравствуйте, rg45, Вы писали:
А>>Я сделал как вы сказали, но не могу обратиться к элементу Grid11[0][0][0][0] А>>дебагер говорит "2382 Side effects are not allowed" А>>??? в чем может быть ошибка?
R>Несколько вопросов: R>- какой компилятор? R>- компилируется ли пример в том виде, в котором привел его я? R>- приведи полный текст модуля(cpp-файла), при компиляции которого возникает ошибка
у меня C++ Builder 6, а какой в ней компилятор — не знаю
да компилируется,
я использую этот массив в классе, полный текст приводить не буду — очень длинно, но в краце так:
cens.cpp
int TCENS::Init()
{
...
int g1 = 11;
int g2 = 41;
V4 Q2(g1, V3(g1, V2(g2, V1(g2,0))));
int m = Q2[0][0][0][0]; // здесь ошибки нет, но если включить окно "watch list", то там вместо значения Q2[0][0][0][0] сообщение - "E2384 Side effects are not allowed"
...
}
int TCENS::DoOneStep()
{
...
Q2[i1][i2][i3][i4] += hr; // здесь происходит ошибка при первом проходе т.е. i1=i2=i3=i4=0
...
}
извините что без тэгов, что-то я не понял как выделять текст нужным цветом
Здравствуйте, piero_, Вы писали:
_>у меня C++ Builder 6, а какой в ней компилятор — не знаю
Ну значит, компилятор — C++ Builder 6
_>да компилируется, _>я использую этот массив в классе, полный текст приводить не буду — очень длинно, но в краце так: _>
_>//...
_> int m = Q2[0][0][0][0]; // здесь ошибки нет, но если включить окно "watch list", то там вместо значения Q2[0][0][0][0] сообщение - "E2384 Side effects are not allowed"
_>//...
_>
Выходит, что среда C++ Builder'a не умеет вычислять значения функций. Ведь, на самом деле, в приведенном примере операция индексирования сводится к вызову перегруженного оператора operator[], который по сути является функцией-членом шаблонного класса std::vector. Что делать в этой ситуации? Зависит от того, на сколько критичным для тебя является это неудобство.
Возможные варианты действий:
— Забить на это;
— Заглянуть в отладчике внутрь объекта Q2 — внутри находятся самые обычные указатели, которые отладчик билдера, наверняка, умеет отображать;
— Выводить все интересующие значения на экран, в файл и т.д.;
— Сменить компилятор и среду разработки. Например, на Microsoft Visual Studio.
_>извините что без тэгов, что-то я не понял как выделять текст нужным цветом
Просто ты немного ошибся с выбором тэга форматирования: ты использовал code, а нужно было ccode.
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
template <typename FirstClass, size_t i>
class MegaVector
{
public:
typedef typename MegaVector<FirstClass,i-1>::type innerType;
typedef std::vector<innerType> type;
};
template <typename FirstClass>
class MegaVector<FirstClass,0>
{
public:
typedef FirstClass type;
};
int main()
{
using namespace std;
typedef MegaVector<int,4>::type V4;
//...
Так красивше, мне кажется
Я пробовал более общно написать(не завязываться на векторе), но что-то мой компилятор ругается, когда я использую передаваемый тип, как шаблон. Если не найду, в чём проблема, — придётся создавать отдельную тему об этом
T>Так красивше, мне кажется T>Я пробовал более общно написать(не завязываться на векторе), но что-то мой компилятор ругается, когда я использую передаваемый тип, как шаблон. Если не найду, в чём проблема, — придётся создавать отдельную тему об этом
Нечто подобное и я хотел написать. Но потом решил, что во-первых, тогда уж лучше действительно, как предлагали выше, использовать boost::multi_array. А во-вторых, автору вопроса на первое время информации для переваривания достаточно и без шаблонов
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Здесь ты проинитил локальную переменную Q2.
_>int TCENS::DoOneStep() _>{ _> ... _> Q2[i1][i2][i3][i4] += hr; // здесь происходит ошибка при первом проходе т.е. i1=i2=i3=i4=0
А здесь ты обращаешься к непроиниченному (нулевого размера) мемберу Q2.