Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> new, delete 
:(
    Опции темы
alex87
Дата 28.2.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



При выполнении программы на этапе delete p[i]
выскакивает Debug Error
Damage after normal block #xx at adres
тоесть программа при освобождении памяти выкидывает данный эксепшн.
В чём может быть дело??

Код


#include <windows.h>


char*** alloc3darray(char*** p, int dim1, int dim2, int dim3);
char** alloc2darray(char** p, int dim1, int dim2);
void free3darray(char*** p, int dim1, int dim2);
void free2darray(char** p, int dim1);


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

char** arch;

arch = alloc2darray(arch, 10, 10);

for(int i=0; i<10; i++)
  memset(arch[i], '1', strlen(arch[i]));

free2darray(arch, 10);

return 0;
}


char*** alloc3darray(char*** p, int dim1, int dim2, int dim3)
{
   for(int i=0; i<dim1; i++)
   {
     p[i] = new char*[dim2];

     for(int j=0; j<dim2; j++)
     {
       p[i][j] = new char[dim3];
     }
   }

   return p;
}

char** alloc2darray(char** p, int dim1, int dim2)
{
   p = new char*[dim1];

   for(int i=0; i<dim1; i++)
   {
     p[i] = new char[dim2];
   }

   return p;
}

void free3darray(char*** p, int dim1, int dim2)
{
  for(int i=0; i<dim1; i++)
  {
    for(int j=0; j<dim2; j++)
    {
      delete p[i][j];
    }

    delete p[i];
  }

  delete []p;
}

void free2darray(char** p, int dim1)
{
  for(int i=0; i<dim1; i++)
  {
    delete p[i];
  }

  delete []p;
}



PM MAIL   Вверх
Fazil6
Дата 28.2.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(alex87 @  28.2.2008,  17:28 Найти цитируемый пост)
В чём может быть дело??

с начала и до конца все неправильно

Код

#include <windows.h>


char*** alloc3darray( int dim1, int dim2, int dim3);
char** alloc2darray( int dim1, int dim2);
void free3darray(char*** p, int dim1, int dim2);
void free2darray(char** p, int dim1);


enum { DIM1 = 10 , DIM2 = 10 , DIM3 = 10 };

int main()
{

    char** arch = alloc2darray( DIM1, DIM2);

    for(int i = 0; i < DIM1; ++i)
    {
        memset(arch[i], i + '0', DIM2 - 1);
        arch[i][DIM2 - 1] = 0;
    }

    free2darray(arch, DIM1);

    return 0;
}


char*** alloc3darray( int dim1, int dim2, int dim3)
{
    char*** p = new char **[dim1];
    for(int i=0; i<dim1; i++)
    {
        p[i] = new char*[dim2];

        for(int j=0; j<dim2; j++)
        {
            p[i][j] = new char[dim3];
        }
    }

    return p;
}

char** alloc2darray( int dim1, int dim2)
{
    char **p = new char*[dim1];

    for(int i=0; i<dim1; i++)
    {
        p[i] = new char[dim2];
    }

    return p;
}

void free3darray(char*** p, int dim1, int dim2)
{
    for(int i=0; i<dim1; i++)
    {
        for(int j=0; j<dim2; j++)
        {
            delete p[i][j];
        }

        delete p[i];
    }

    delete []p;
}

void free2darray(char** p, int dim1)
{
    for(int i=0; i<dim1; i++)
    {
        delete p[i];
    }

    delete []p;

}


Это сообщение отредактировал(а) Fazil6 - 28.2.2008, 19:13
PM MAIL   Вверх
alex87
Дата 29.2.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Все бы хорошо, но память не освобождается.
 

Это сообщение отредактировал(а) alex87 - 29.2.2008, 11:09
PM MAIL   Вверх
Alek86
Дата 29.2.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



alex87, говорил уже и повторю - НЕ ПАРЬСЯ с delete там, где это делать необязательно
C++ это не только классы, но еще и библиотеки - STL, BOOST


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 29.2.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(alex87 @  29.2.2008,  12:06 Найти цитируемый пост)
Все бы хорошо, но память не освобождается.

это ты с чего взял?


--------------------
Мой блог
PM MAIL WWW   Вверх
alex87
Дата 29.2.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Цитата

alex87, говорил уже и повторю - НЕ ПАРЬСЯ с delete там, где это делать необязательно
C++ это не только классы, но еще и библиотеки - STL, BOOST



Почему необязательно?
STL и BOOST за меня это сделает?
Хотелось бы знать , чем конкретно они мне могут помочь.

Добавлено через 11 минут и 44 секунды
Цитата

Все бы хорошо, но память не освобождается.


Виноват, неправ , не туда посмотрел

Это сообщение отредактировал(а) alex87 - 29.2.2008, 11:41
PM MAIL   Вверх
Damarus
Дата 29.2.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(alex87 @  29.2.2008,  11:40 Найти цитируемый пост)
Хотелось бы знать , чем конкретно они мне могут помочь.

The Boost Multidimensional Array Library
PM MAIL ICQ Jabber   Вверх
Alek86
Дата 29.2.2008, 12:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(alex87 @  29.2.2008,  11:40 Найти цитируемый пост)
STL и BOOST за меня это сделает?

именно smile

в твоем случае что-то типа:
Код


#include <vector>
#include <iostream>
#include <boost/foreach.hpp>

using std::vector;
using std::cout;
using std::endl;

int main() {

vector<vector<char> > arch;

 // alloc2darray & сразу "вызов memset"
 arch.resize(10);
 BOOST_FOREACH(vector<char>& p, arch) {
   p.resize(10);
   BOOST_FOREACH(char& c, p) {
     c = '1';
   }
 }

  BOOST_FOREACH(vector<char>& p, arch) {
    BOOST_FOREACH(char& c, p) {
      cout << c << " ";
    }
    cout << endl;
  }

return 0;
}



синтаксис тебе навряд покажется знакомым и может даже запутанным, но тут просто нужно разобраться

Добавлено @ 12:09
Damarus, не уверен, что нужно сразу в глубины буста кидать человека, который даже пока векторами не пользуется

Это сообщение отредактировал(а) Alek86 - 29.2.2008, 12:10


--------------------
user posted image    user posted image
PM MAIL   Вверх
alex87
Дата 3.3.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Тогда ещё вопрос: у меня программа работает с базой данных.
К примеру я делаю Select * и загоняю где-то 10000 записей(к примеру) в vektor
Насколько эффективно vektor работает с памятью? стоит ли его использовать в данном случае?
PM MAIL   Вверх
marcusmae
Дата 3.3.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



alex87, чтобы обеспечить плюрализм мнений, скажу, что лично я The Boost Multidimensional Array Library не пользуюсь, равно как и никакими другими специальными надстройками, хотя в моих задачах многомерные массивы имеются в изобилии. Любой из них я завожу, как одномерный :

Код

double* arr3d = new double[nx*ny*ns];


По скорости доступа получается что-то вроде автоматического массива, хотя элементный доступ на первый взгляд не очень удобен :

Код

double value_ijk = arr3d + np * k + iy * j + i // arr3d[i,j,k] or arr3d[k][j][i] 


Но всегда можно положить сие в класс и определить operator() (int i, int j, int k). А в большинстве случаев и это не нужно, поскольку при циклических операциях над элементами массива не обязательно непременно извлекать значения по индексам - достаточно одного указателя на текущий элемент и отсутствия ошибок при его передвижении на следующий.

А указатели на указатели на указатели - это вообще жуть. Ведь это - не целостный массив, а валяющиеся в разных местах памяти куски.

Это сообщение отредактировал(а) marcusmae - 3.3.2008, 14:14


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
vinter
Дата 3.3.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(alex87 @  3.3.2008,  14:49 Найти цитируемый пост)
Насколько эффективно vektor работает с памятью? 

достаточно эффективно, была тут когда то холивар тема vector vs standart array, так вот разницы в производительности не было.
Цитата(alex87 @  3.3.2008,  14:49 Найти цитируемый пост)
 стоит ли его использовать в данном случае?

почему бы нет


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 3.3.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

double value_ijk = arr3d + np * k + iy * j + i;

не дай бог изменять k, j, i в неправильном порядке получишь такие тормоза какие не снились ни одной надстройке))
но это только при большом размере массива....
PM MAIL Skype GTalk   Вверх
marcusmae
Дата 3.3.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Ой, я неправильно написал, кстати :

Код

double value_ijk = *(arr3d + np * k + iy * j + i);


Цитата(Lazin @  3.3.2008,  15:58 Найти цитируемый пост)
в твоем примере при обходе массива можно легко напутать

Да, это есть - с непривычки. Я сам сначала плевался, прошло несколько месяцев - привык и стал делать мало ошибок.

Цитата(Lazin @  3.3.2008,  15:58 Найти цитируемый пост)
не дай бог изменять k, j, i в неправильном порядке получишь такие тормоза какие не снились ни одной надстройке

Пардон, а при доступе просто по индексу по-другому будет? Я написал : доступ по индексам - не особо нужен. Пусть у нас double* ptr стоит в элементе (i,j,k), тогда :

Код

(i + i_shift, j, k) ~ (ptr + i_shift)
(i, j + j_shift, k) ~ (ptr + j_shift * nx)
(i, j, k+k_shift) ~ (ptr + k_shift * np) // np = nx * ny


Если долго писать - можно всё заделать в макросы. Если шифт единичный, то вычислительные операции ограничиваются одним лишь сложением, что уже не так ёмко. Например, чтобы в цикле переходить от одного элемента к другому построчно, нужно в цикле прописать ptr++ и всё.

В общем, боюсь, это - тема для холиваров. Я - за векторизацию многомерных массивов (имхо, всё просто и чётко), а Вам, видимо, больше нравятся всякие контейнеры.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ln78
Дата 3.3.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



Цитата(Fazil6 @  28.2.2008,  19:12 Найти цитируемый пост)

Код

void free3darray(char*** p, int dim1, int dim2)
{
    for(int i=0; i<dim1; i++)
    {
        for(int j=0; j<dim2; j++)
        {
            delete p[i][j];
        }

        delete p[i];
    }

    delete []p;
}

void free2darray(char** p, int dim1)
{
    for(int i=0; i<dim1; i++)
    {
        delete p[i];
    }

    delete []p;

}




Fazil6,  а почему ты заленился везде ставить квадратные скобки? Я бы написал:
Код

void free3darray(char*** p, int dim1, int dim2)
{
   for(int i=0; i<dim1; i++)
   {
      for(int j=0; j<dim2; j++)
      {
         delete[] p[i][j];
      }

      delete[] p[i];
   }

   delete []p;
}

void free2darray(char** p, int dim1)
{
   for(int i=0; i<dim1; i++)
   {
      delete[] p[i];
   }

   delete []p;

}



Это сообщение отредактировал(а) Ln78 - 3.3.2008, 16:20
PM MAIL   Вверх
baldina
Дата 5.3.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



alex87, 
Цитата

К примеру я делаю Select * и загоняю где-то 10000 записей(к примеру) в vektor

вполне возможно, что твоя задача этого действительно требует, но все-таки подумай: если результат обрабатывается последовательно, его вообще никуда загонять не надо, а если ты по этим данным что-то вычисляешь (или преобразуешь результат), то может быть такое можно сделать специальным запросом sql?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0791 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.