c++ - 我可以在基元上调用 delete 吗?

标签 c++ templates destructor delete-operator

我有一个模板化类 myFoo,它存储类型 T 的“内容”,它可以是基本类型或指向复杂类型的指针。当 myFoo 被删除时,我想释放与它恰好存储的所有内容相关的所有内存。这意味着我需要在存储的每个指针上调用 delete,但我最终也可能会在原语上调用 delete。这样安全吗??

我在下面包含了 myFoo 的草图,以更好地突出显示正在发生的事情。我不确定析构函数的行为是否定义明确。

template<class T>
class myFoo
{
   public:
       myFoo(int size) 
       { 
          size_ = size;
          T* foo = new T[size_]; 
       }

       void addFoo(T tmp, int index) 
       {
             foo[index] = tmp;
       }

       virtual ~myFoo()
       {
           for(int i=0; i < size_; i++)
           {
               delete foo[i];
           }
           delete [] foo;
       }

  private:
      int size_;
      T* foo;
}

最佳答案

唯一可以调用 delete 的是指针类型。例如,在 int 上调用 delete 是错误的。如果你安排你的模板,使你的代码试图做一些错误的事情,编译器会让你知道并拒绝编译你的代码。

所以不,您不必担心“意外”删除非指针。

关于c++ - 我可以在基元上调用 delete 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11643395/

相关文章:

c++ - 将函数应用于包含的对象,前提是它们派生自基类型

c++ - 使用 if 语句读取整行

c++ - 是否可以在不复制的情况下从 std::vector 中提取数据? (并让 vector 忘记它)

c++ - 初始化和访问可变类模板的成员

c++ - C++ 中高效的 Sum 和 Assignment 运算符重载

html - Perl 模块 HTML::Template 可以使用 <TMPL_VAR NAME=...> 之外的其他语法吗?

c++ - 在 C++ 中使用宏生成函数

C#:在终结器中,如何确定应用程序是否正在关闭?

c++ - 析构函数删除函数中的拷贝返回动态结构

c++ - 在析构函数中持有 std::lock_guard 是否安全?