Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > double free of corruption


Автор: sergioK1 9.6.2016, 18:52
последний раз такое делал лет 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 может каждый раз дать разные адреса тоесть деструктор нудно вызывать каждый раз,  в нете искал ничего толкового не нашел ,



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

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

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

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

Автор: sergioK1 9.6.2016, 20:19
Цитата(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-tutorial-introducing-the-move-constructor-and-the-move-assignment-operator/ 
с помощью std:move такое решаеться ?  каким образом? 

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

можно и с move

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

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

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

можно и с move

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

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

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


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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)