Joh*_*ohn 1 c++ templates compiler-errors
我在教自己c ++模板.我写了下面的代码,我得到一个奇怪的错误,关于一个未被分配的指针被释放.我猜测,东西在我的类模板的构造是不实际调用new上int,当我问一个<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)
您缺少复制构造函数和赋值运算符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)