具有嵌套类作为私有类的类中具有析构函数的内存泄漏

问题描述 投票:0回答:1

我有一个Tree类,它有一个嵌套的私有Node类。我的[[Tree类的构造函数创建一个Node对象,并将其设置为_info,该对象是我的[[Tree类中的Node类型的指针。我没有任何错误,但是当我使用valgrind检查程序是否存在内存泄漏时,我发现我存在内存泄漏。我知道问题在于解构函数,但我不知道如何解决。在显示代码之前,我应该提到模板的第二个参数(N)在这里并不重要,您可以忽略它。

这是我的代码:
tree.hpp

#ifndef TREE_HPP #define TREE_HPP #include <iostream> #include <cstddef> template <typename T, char N> class Tree { private: class Node; Node* _info; public: Tree(); Tree(T, char); Tree(const Tree&) = delete; Tree& operator= (const Tree&) = delete; Tree (Tree&&); Tree& operator= (Tree&&); ~Tree() {delete _info;} // something is wrong here bool ins(char, Tree*); Tree* fils(char); void print(){ std::cout << _info->getData() << std::endl; } }; template <typename T, char N> bool Tree<T, N>::ins(char index, Tree* childTree){ if (_info){ _info->getChildren()[index] = childTree; return true; } return false; } template <typename T, char N> Tree<T, N>::Tree() : _info(nullptr) {} template <typename T, char N> Tree<T, N>::Tree(T data, char size) { Node* node = new Node(data, size); // I think I don't free this _info = node; } template <typename T, char N> Tree<T, N>::Tree(Tree&& t) { _info = t._info; t._info = nullptr; } template <typename T, char N> Tree<T, N>& Tree<T, N>::operator= (Tree&& t) { if (&t != this) {delete _info; _info = t._info; t._info = nullptr;} return *this; } template <typename T, char N> typename Tree<T,N>::Node* Tree<T, N>::info() { return _info;} template <typename T, char N> Tree<T,N>* Tree<T, N>::fils(char index){ return _info->getChildren()[index]; } template <typename T, char N> class Tree<T, N>::Node { private: T _data; Tree* _children; bool _isWord; public: Node(); Node(T, char); Tree** getChildren() {return &this->_children;} T getData(){return this->_data;} ~Node() = default; }; template <typename T, char N> Tree<T,N>::Node::Node(){ _data = 0; _children = nullptr; _isWord = false; } template <typename T, char N> Tree<T,N>::Node::Node(T data, char size){ _data = data; _isWord = false; _children = new Tree<T,N>[size]; } #endif

main.cpp

#include <iostream> #include <cstddef> #include <exception> #include "tree.hpp" #define SIZE 5 int main() { Tree<char,SIZE> n1('A',SIZE); Tree<char,SIZE> n1_1('B',SIZE); Tree<char,SIZE> n1_2('C',10); // ! here the size is always 5 Tree<char,SIZE> n1_1_1('D',SIZE); n1.ins(0,&n1_1); n1.ins(1,&n1_2); n1_1.ins(0,&n1_1_1); n1.fils(0)->print(); n1.fils(1)->print(); n1_1.fils(0)->print(); return 0; } 我也愿意提出任何改进我的代码的建议。谢谢高级

c++ class memory
1个回答
0
投票
_children = new Tree<T,N>[size];
[无处没有delete[] _children;

甚至有更多问题:


Tree** getChildren() {return &this->_children;}

此函数返回一个指向不是数组元素的单独Tree*对象的指针。

return _info->getChildren()[index];

这里,您将索引指向指向孤立对象的指针,就好像它在数组中一样。使用0以外的任何其他索引都有UB。
© www.soinside.com 2019 - 2024. All rights reserved.