在析构函数中删除[]

时间:2012-08-15 00:12:01

标签: c++ templates destructor delete-operator

好吧,我正在学习模板,我对下一个代码有疑问:

        #include <iostream>

        using namespace std;

        template<class T, int n>
        class Table
        {
        public:
            Table();
            //~Table();
            int& operator[](int i);
            bool Resize(int n);
            int Count();
            void Free();

        private:
            T* inst;
            int count;
        };

        template<class T, int n>
        Table<T, n>::Table()
        {
            inst = new T[n];
            count = n;
        }

        template<class T, int n>
        void Table<T, n>::Free()
        {
            delete[] this->inst;
        }

        template<class T, int n>
        int& Table<T, n>::operator[](int i)
        {
            return inst[i];
        } 

        template<class T, int n>
        bool Table<T, n>::Resize(int n)
        {
            this->inst = (T*)realloc(this->inst, sizeof(T)*count + sizeof(T)*n);
            if(!inst)
                return false;

            return true;
        }

        template<class T, int n>
        int Table<T, n>::Count()
        {
            return this->count;
        }

        template<typename T, int n> void ShowTable(Table<T, n> t)
        {
            for(int i=0; i<t.Count(); i++)
                cout<<t[i]<<endl;
        }

        int main()
        {
            Table<int, 2> table;
            table[0] = 23;
            table[1] = 150;
            ShowTable(table);

            system("pause");
            table.Free();

            return 0;
        }

它有效但是,当我把delete[] this->inst;放在析构函数中时,它会抛出一个Assertion Failed,我不知道为什么......我的意思是,删除析构函数中的资源是不是很糟糕?

1 个答案:

答案 0 :(得分:1)

您在以下方法定义中有重复的标识符n

    template<class T, int n>
    bool Table<T, n>::Resize(int n)

我收到上述声明的错误,我很惊讶你没有。您需要将其中一个int n重命名为其他内容(例如Resize(int newsize))。

删除析构函数中的inst成员没有问题。这就是你应该做的,以避免内存泄漏。