问一个关于操做符重载的问题!

okbody 2004-09-05 06:07:34
我写了一个一维数组类!

CVector
重载了+ - * /
CVector operator *(const CVector& vtor1, const double& dv2)
{
CVector vtor, v1;
v1 = vtor1;
vtor = v1.Mul(dv2);
return vtor;
}
v = v*2;
DEBUG运行到这里就出错!
DEBUG窗口里有这句话
HEAP[PowerTwo.exe]: Invalid Address specified to RtlValidateHeap( 340000, 34e090 )
这里为什么会说是无效的内存地址!

堆栈里
NTDLL! 77f813b1()
NTDLL! 77fb6972()
NTDLL! 77f8be26()
KERNEL32! 77e67345()
_CrtIsValidHeapPointer(const void * 0x0034e0b0) line 1697
_free_dbg_lk(void * 0x0034e0b0, int 1) line 1044 + 9 bytes
_free_dbg(void * 0x0034e0b0, int 1) line 1001 + 13 bytes
operator delete(void * 0x0034e0b0) line 351 + 12 bytes
CVector::Release() line 47 + 18 bytes
CVector::~CVector() line 41
operator*(const CVector & {...}, const double & 2.0000000000000000) line 228 + 51 bytes
CPowerTwoView::OnFlow() line 232 + 46 bytes

不用重载过的操作符就没有这个问题!
检查了析构,内存释放那里也没有什么问题啊!
请问重载2元操作符有什么要注意的地方吗(特别是在类里有内存分配释放)?

...全文
144 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
freefalcon 2004-09-06
  • 打赏
  • 举报
回复
_CrtIsValidHeapPointer
该错误一般出现在内存的分配和释放不在同一个堆中,也就是使用dll时
楼主是通过dll来使用CVector的吗?
goodluckyxl 2004-09-06
  • 打赏
  • 举报
回复
class CVector
{
private:
int Array[1];
public:
CVector() { Array[1] = 1;};
CVector( int* ArrayInit )
{
for( int i = 0; i < 1; i++ )
Array[i] = *(ArrayInit+i);
}
~CVector() {};

friend CVector operator *( CVector& Object1, CVector& Object2 );


};
//得到运算后的数组返回有对这个类型的构造函数初始化对象
CVector operator*( CVector& Object1, CVector& Object2 )
{
int ReturnArray[1] = {0};
for( int i = 0; i < 1; i++ )
ReturnArray[i] = Object1.Array[i] * Object2.Array[2];

return CVector( ReturnArray );
}
sharkhuang 2004-09-06
  • 打赏
  • 举报
回复
vtor = v1.Mul(dv2);
函数mul怎么定义的?
tatbaby 2004-09-06
  • 打赏
  • 举报
回复
顺便一提,const double& dv2 //已经没有意义了
默认的传值传递方式 已经不会对dv2进行修改,因为它本身已经是一个临时副本了


不知道你的mul函数是怎么写的
还有,vtor = v1.Mul(dv2); 你赋值= 函数如果没有重载,而你在类 CVector 中如果说有指针数据成员的话,一定会出错的;因为默认的 赋值函数只是简单的各个数据成员逐个位拷贝,因此指针成员也会被复制,这就出现了2个指针指向同一块内存的问题。


  • 打赏
  • 举报
回复
CVector operator *(const CVector& vtor1, const double& dv2)
{
CVector vtor, v1;
v1 = vtor1;
double d;
d = dv2;
vtor = v1.Mul(d);
return vtor;
}
试试看,我不知道你的Mul怎么写的,是不是要用到参数的地址。
  • 打赏
  • 举报
回复
CVector operator *(const CVector& vtor1, const double& dv2)
==>CVector operator *(const CVector& vtor1, const double dv2)
试试看
Squall1009 2004-09-05
  • 打赏
  • 举报
回复
看大家讨论!
renheihei 2004-09-05
  • 打赏
  • 举报
回复
v = v*2;
这里需要自动类型转换,不知道楼主有没有?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧