Утечка памяти при векторном присваивании в C ++ с использованием valgrind

Нравится это:

class Line
  attr_reader :p1, :p2
  def initialize point1, point2
    @p1 = point1
    @p2 = point2
  end
end

line = Line.new([1,2], [3,4])

Сохранить line:

FNAME = 'my_file'

File.open(FNAME, 'wb') {|f| f.write(Marshal.dump(line))}

Получить в line1:

line1 = Marshal.load(File.binread(FNAME))

Подтвердить, что он работает :

line1.p1 # => [1, 2]
0
задан Jiancong 21 February 2019 в 03:17
поделиться

2 ответа

По предложению @ n.m. я проверил весь код. И я думаю, что нашел проблему. Упрощенный конструктор / деструктор класса и манипулирование следующим образом:

#include <iostream>                                 
#include <vector>                                 
#include <string.h>                                 
using namespace std;                                

struct leak_struct {
    vector<string> array;
    int set;
};

int main(){                                
    leak_struct ls;                                

    ls.array.push_back("hello");                                
    ls.array.push_back("world");                                

    memset(&ls, 0, sizeof(ls));

    ls.array.push_back("code");                                
    ls.array.push_back("review");                                

    memset(&ls, 0, sizeof(ls));
    return 0;                                
}    

Причина, по которой он пропускает, заключается в строке, где вызывается memset, этот вызов обнулит указатель вектора в структуре и делает новый выделенный буфер не освобожденным. .

0
ответ дан Jiancong 21 February 2019 в 03:17
поделиться

Кажется, что оператор присваивания treeNode.weight вызывается, он выделяет некоторую память для использования, но никогда не освобождается.

==37533==    by 0x48B73F: int* std::vector<int, std::allocator<int> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<int const*, std::vector<int, std::allocator<int> > > >(unsigned long, __gnu_cxx::__normal_iterator<int const*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int const*, std::vector<int, std::allocator<int> > >) (stl_vector.h:1224)
==37533==    by 0x48B2BD: std::vector<int, std::allocator<int> >::operator=(std::vector<int, std::allocator<int> > const&) (vector.tcc:195)
0
ответ дан Quy Phan 21 February 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: