如果您认为我没有在此问题中包含任何可能有用的内容,请随时发表评论并提出相关问题。
我有一个带有2个构造函数的简单Dna结构,其中我分配了一个int数组和一个析构函数,我删除了这个数组(我没有在代码中的任何其他位置反映这个数组)。这很简单,但它会产生无效的免费。
#ifndef __DNA_H__
#define __DNA_H__
#include <random>
#include <cstddef>
#include "constants.hpp"
template <class URNG>
struct Dna
{
Dna(const Dna& lhs, const Dna& rhs, URNG& urng)
{
_data = new int[c_dnaLength];
std::bernoulli_distribution startDistrib(0.5);
std::bernoulli_distribution mutatDistrib(c_mutatP);
std::bernoulli_distribution crossDistrib(c_crossP);
const Dna * ptr = (startDistrib(urng)) ? &lhs : &rhs;
for (std::size_t i = 0; i < c_dnaLength; i++)
{
if (crossDistrib(urng))
{
ptr = (ptr == &rhs) ? &lhs : &rhs;
}
_data[i] = mutatDistrib(urng) ? 1 ^ ptr->_data[i] : ptr->_data[i];
}
}
Dna(URNG& urng)
{
_data = new int[c_dnaLength];
std::uniform_int_distribution<int> dnaDistrib(0, 1);
for (std::size_t i = 0; i < c_dnaLength; i++)
{
_data[i] = dnaDistrib(urng);
}
}
~Dna()
{
delete[] _data;
}
int* _data;
};
#endif
这里有一些valgrind日志:
==5084== Invalid free() / delete / delete[] / realloc()
==5084== at 0x4C2C05C: operator delete[](void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5084== by 0x40263F: Dna<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> >::~Dna() (dna.hpp:47)
当我擦除包含Dna结构成员的类的std :: list的成员时,析构函数会调用...因此,如果没有显示大块代码,则会有点复杂。