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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> double free of corruption, memory corruption  
:(
    Опции темы
sergioK1
Дата 9.6.2016, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



последний раз такое делал лет 15назад 
как исправить ? 

Код

#include <iostream>
#include <vector>
#include <string.h>

using  namespace std;

class MemoryPage
{
    size_t size;
    char* buf;
    public:

  explicit MemoryPage(int sz=8):size(sz) {
       buf=new char[size];
       std::cout<<"buffer='" << buf<<"'"<<" start address "<<(void *)buf<<std::endl;
    //   std::cout<<"sz=" << size<<std::endl;
       for(size_t i=0;i <size; i++){
          buf[i]='a'+32/sz - 1 ;
       }
     }


    ~MemoryPage(){
     if(buf[0]!=null ) {
        std::cout<<"buffer='" << buf<<"'"<<" delete from  address "<<(void *)buf<<"\t"<< size<<" bytes "<<std::endl;
        delete[] buf;
      }
     }
  };

using namespace std;

int main()
{
    vector<MemoryPage> vm;
    MemoryPage memoryPage(1024);
    vm.push_back(MemoryPage(32));
    vm.push_back(MemoryPage(16));
    vm.push_back(MemoryPage(8));
    cout<<" destroy vector "<< endl;
}


при выделении памяти в контсрукторе каждый раз начало памяти один и тот же адресс,
тоесть по логике надо чтобы деструктор вызвался один раз с максимальной длиной,
с другой стороны malloc может каждый раз дать разные адреса тоесть деструктор нудно вызывать каждый раз,  в нете искал ничего толкового не нашел ,



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


Эксперт
****


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

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



Ваш объект в таком виде как сейчас, нельзя копировать.
(а он копируется при помещении в вектор, и внутри вектора когда тот расширяется)
Почему нельзя?
Потому-что при удалении копии, происходит освобождение буфера delete[] buf;
И новый объект, имеет указатель на память, которая уже удалена (освобождена)

Предлагаю вам воспользоваться умным указателем, вместо  char* buf;

зы:
Цитата(sergioK1 @  9.6.2016,  18:52 Найти цитируемый пост)
  if(buf[0]!=null ) {

а это вообще черте-что, зачем оно? Это не нужно

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


Опытный
**


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

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



Цитата(volatile @ 9.6.2016,  18:57)
Предлагаю вам воспользоваться умным указателем, вместо  char* buf;

зы:
Цитата(sergioK1 @  9.6.2016,  18:52 Найти цитируемый пост)
  if(buf[0]!=null ) {

а это вообще черте-что, зачем оно? Это не нужно

в  теории знаю а  как  это написать  практически ?, лет 5  к С++ не притрагивался, 


потом взято тут http://blog.smartbear.com/c-plus-plus/c11-...nment-operator/ 
с помощью std:move такое решаеться ?  каким образом? 
PM MAIL   Вверх
volatile
Дата 9.6.2016, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(sergioK1 @  9.6.2016,  20:19 Найти цитируемый пост)
с помощью std:move такое решаеться ?

можно и с move

но с умными проще будет
https://ideone.com/wTSxcA

если я конечно правильно понял, что вы вообще пытались сделать  smile 

PM MAIL   Вверх
sergioK1
Дата 9.6.2016, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(volatile @ 9.6.2016,  20:12)
Цитата(sergioK1 @  9.6.2016,  20:19 Найти цитируемый пост)
с помощью std:move такое решаеться ?

можно и с move

но с умными проще будет
https://ideone.com/wTSxcA

если я конечно правильно понял, что вы вообще пытались сделать  smile

вот это что такое ? array_deleter<char>())
что передаеться в темплат? у меня в дебаге обьект пустой ,


PM MAIL   Вверх
volatile
Дата 9.6.2016, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(sergioK1 @  9.6.2016,  21:49 Найти цитируемый пост)
вот это что такое ? array_deleter<char>())

это чтобы умный указатель корректно массив удалил.
по умолчанию он просто вызывал бы delete p;
а здесь ему указывается чтобы он вызывал delete[] p;

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.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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