【发布时间】:2014-08-08 13:40:19
【问题描述】:
我遇到了一些关于 operator= 重载的问题。 我的代码是
#include <stdlib.h>
#include <iostream>
const std::size_t DIM = 10;
template <typename T>
class rowvec
{
private:
T* m_pnt;
std::size_t m_dim;
public:
rowvec();
rowvec(std::size_t);
~rowvec();
rowvec<T>& operator=(const rowvec<T>& x);
T* pnt();
};
template <typename T>
rowvec<T>::rowvec()
{
m_dim = DIM;
m_pnt = (T*) calloc (DIM ,sizeof(T));
}
template <typename T>
rowvec<T>::rowvec(std::size_t n)
{
m_dim = n;
m_pnt = (T*) calloc(m_dim,sizeof(T));
}
template <typename T>
rowvec<T>::~rowvec()
{free(m_pnt);}
template <typename T>
rowvec<T>& rowvec<T>::operator=(const rowvec<T> &x)
{
std::cout << "hello" << std::endl;
if (this != &x)
{
free (m_pnt);
this->m_dim=x.m_dim;
m_pnt = (T*) calloc (m_dim,sizeof(T));
for (int i=0; i!=m_dim; i++)
*(m_pnt+i)=*(x.m_pnt+i);
}
return *this;
}
template <typename T>
T* rowvec<T>::pnt()
{return m_pnt;}
int main()
{
rowvec<int> k(3);
rowvec<int> c=k;
std::cout << "ok" << std::endl;
return 0;
}
没有编译错误,但是我运行的时候结果是:
ok
*** Error in `./blog': double free or corruption (fasttop): 0x0000000001a5e010 ***
如果我以这种方式更改代码:
int main()
{
rowvec<int> k(3);
rowvec<int> c;
c=k;
std::cout << "ok" << std::endl;
return 0;
}
一切正常(输出为)
hello
hello
ok
有没有办法允许像“rowvec c=k;”这样的声明?
【问题讨论】:
-
你需要一个拷贝构造函数
-
使用向量,不需要添加任何拷贝构造函数或赋值运算符。
-
即使你修复了分配错误,你的课程也会在你尝试
rowvec<std::string>时立即崩溃。原因是您使用的是calloc,而calloc不构造对象。通常,您在 C++ 程序中使用C构造,而这些 C 构造不适用于非 POD 类型。
标签: c++ pointers operator-overloading operators