Нравится это:
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]
По предложению @ 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, этот вызов обнулит указатель вектора в структуре и делает новый выделенный буфер не освобожденным. .
Кажется, что оператор присваивания 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)