delete [] приводит к повреждению кучи

Тема в разделе "LANGS.C", создана пользователем Flest, 8 июл 2010.

  1. Flest

    Flest New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    12
    Есть приложение и библиотека dll, с которой оно работает.
    Из dll'ки импортируется функция GetFilList, которая выделяет внутри себя память. При этом необходимо, чтобы выделенная память была доступна потом снаружи, в приложении.

    Код dll'ки:
    Код (Text):
    1. extern "C" __declspec(dllexport) int GetFileList(..., char **packed_files, unsigned int *packed_size)
    2. {
    3.    ...
    4.    *packed_size = 123;
    5.    *packed_files = new char[*packed_size]
    6.  
    7.    //Пишем *packed_size байт в *packed_files
    8.  
    9.    return EXIT_SUCCESS;
    10. }
    В приложении, dll'ка вызывается следующим образом:
    Код (Text):
    1. int main()
    2. {
    3.    char *packed_files;
    4.    unsigned int packed_size;
    5.  
    6.    GetFileList(..., &packed_files, &packed_size);
    7.    //Теперь можно совершенно нормально работать с данными по указателю packed_files
    8.    //Все packed_size байт содержат именно то, что было записано внутри функции GetFileList.
    9.    
    10.    delete [] packed_files; //delete здесь  приведет к повреждению кучи!
    11.  
    12. }
    Пробовал удалять "delete [] *packed_files;" прямо перед "return EXIT_SUCCESS;" в dll'ке - все работает, куча целая.

    Получается, что внутри функции в dll'ke память освобождается корректно, а сразу после выхода из функции - с повреждением кучи. Как так получается?:)
     
  2. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
  3. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Рихтер 19 глава там как раз про случай с кучей общее правило таково если библиотека предоставляет интерфейс который выделяет память то она должна предоставить еще один интерфейс для освобождения этой памяти
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Безгеморно выделяем память посредством NtAllocateVirtualMemory|NtMapViewOfSection.
     
  5. Flest

    Flest New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    12
    Буду пробовать, всем спасибо!