C++模板代码导致在显然未正确分配的对象上调用delete时出错

Joh*_*ohn 1 c++ templates compiler-errors

我在教自己c ++模板.我写了下面的代码,我得到一个奇怪的错误,关于一个未被分配的指针被释放.我猜测,东西在我的类模板的构造是不实际调用newint,当我问一个<int>类型这一类的.代码正在由CodeRunnermac 自动编译和运行,我设置为使用clang++编译器来处理c++文件.

#include <vector>
#include <iostream>

template <typename T>
class HeapVal
{
    public:
        HeapVal(T val) {ptr = new T(val);}
        ~HeapVal() {delete ptr;}
        T get() {return *ptr;}
    private:
        T* ptr;
};

int main(){
  std::vector< ::HeapVal<int> > vec;
  for(int i = 0; i < 1000; ++i){
    ::HeapVal<int> h(i);
    vec.push_back(h);
  }
  for(int i = 0; i < 1000; ++i){
    std::cout << vec[i].get() << std::endl;
  }
  return( 0 );
}
Run Code Online (Sandbox Code Playgroud)

该代码在编译或执行期间导致以下错误(在我看来就像运行时类错误).

Untitled(30214) malloc: *** error for object 0x7f82f24007c0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Run Command: line 1: 30214 Abort trap: 6           ./"$2" "${@:3}"
Run Code Online (Sandbox Code Playgroud)

Stu*_*etz 6

您缺少复制构造函数和赋值运算符HeapVal.这意味着你最终会delete不止一次尝试同一个内存,因为你有多个指针 - 这就是造成崩溃的原因.

尝试这样的事情:

template <typename T>
class HeapVal
{
public:
    explicit HeapVal(T val)
    :   ptr(new T(val))
    {}

    ~HeapVal()
    {
        delete ptr;
    }

    HeapVal(const HeapVal& rhs)
    :   ptr(new T(*rhs.ptr))
    {}

    HeapVal& operator=(const HeapVal& rhs)
    {
        HeapVal(rhs).swap(*this);
        return *this;
    }

    T get() const
    {
        return *ptr;
    }

private:
    T* ptr;

    void swap(HeapVal& rhs)
    {
        std::swap(ptr, rhs.ptr);
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 哦,是的,默认的复制构造函数只会使一个指针等于另一个...我想我没有意识到当我将某些东西推入std :: vector时会产生副本. (2认同)