在构造函数中使用简单分配无效,在析构函数中删除[]

时间:2015-01-25 12:28:54

标签: c++ memory raii

如果您认为我没有在此问题中包含任何可能有用的内容,请随时发表评论并提出相关问题。

我有一个带有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的成员时,析构函数会调用...因此,如果没有显示大块代码,则会有点复杂。

0 个答案:

没有答案