为什么我new出来的char*赋值之后删除不了啊?

jessenee 2003-10-21 11:13:16
class MyClass()
{
int m_nSize;
char *p_Msg;
MyClass(int size);
~MyClass();
//other codes
};

MyClass::MyClass(int size)
{
p_Msg=new char[size];
char a[]="12345"
//strcpy(p_Msg,a); 如果有这句,析构函数就会出错
//memcpy(p_Msg,a,5); 如果有这句,析构函数也会出错
//size足够大来容纳要拷贝的字符
}

MyClass::~MyClass()
{
delete p_Msg;
}

我用的是控制台程序,最奇怪的是其他类似的类都没问题,只有这一个不好用。
...全文
78 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
SCUM 2003-10-22
  • 打赏
  • 举报
回复
p_Msg = NULL;
hailinm 2003-10-22
  • 打赏
  • 举报
回复
楼主的代码很不规范,没有讨论的价值,最好规范后再套论。
fierygnu 2003-10-22
  • 打赏
  • 举报
回复
HEAP[link.exe]: Heap block at 03154B60 modified at 03154B8D past requested size of 25
看看说的是什么地方,越界了。
ahacrazydragon 2003-10-22
  • 打赏
  • 举报
回复
将你的程序完整的贴出来吧,你说的很莫名
Jinhao 2003-10-22
  • 打赏
  • 举报
回复
我以前在VC6里遇见过这个问题,就是使用了strcpy(),就非法操作,害得只有自己写个strcpy()了
jessenee 2003-10-22
  • 打赏
  • 举报
回复
值是准确的。
没有相互赋值的时候啊
sham2k 2003-10-22
  • 打赏
  • 举报
回复
此外,类Data1,Data2,myClass各自的不同对象间有没有相互赋值、初始化、作为函数参数,有任何一个,程序都会出内存错。
sham2k 2003-10-22
  • 打赏
  • 举报
回复
我的问题是这个值是准确的吗?有没有调试验证一下?
jessenee 2003-10-22
  • 打赏
  • 举报
回复
to: xfxfxf(特例独行的猪)
应该是memcpy(pData+m_nSize,&Data2.a,sizeof(int));我不小心写错了。不好意思。


to: sham2k(sham2k)
Data2.m_nSize就是Data2中所有数据大小的总和
sham2k 2003-10-22
  • 打赏
  • 举报
回复
pData1=new Data1(str);
pData2=new Data2(); ----> Data2.m_nSize=??
m_nSize=Data1.m_nSize+Data2.m_nSize; --> m_nSize = ??
pData=new char[m_nSize];
int nCurrSize=0;
memcpy(pData, Data1.pData, Data1.m_nSize);
nCurrSize+=Data1.m_nSize;
memcpy(pData+m_nSize,Data2.a,sizeof(int));
xfxfxf 2003-10-22
  • 打赏
  • 举报
回复
不好意思,没看见你的a是一个int,那你时想把他当成指针呢,还是int的一个变量?如果是变量的话,那你memcpy他做什么用?
jessenee 2003-10-22
  • 打赏
  • 举报
回复
楼上的,应该是sizeof(int)啊,为什么不是?一个int在内存中一般要占4byte,不过为了安全我用sizeof(int).
另:我的pData只是个char数组,不是字符串,因为中间有好多数据是0,如果是字符串的话就截断了,所以没有必要+1
xfxfxf 2003-10-22
  • 打赏
  • 举报
回复
memcpy(pData+m_nSize,Data2.a,sizeof(int));
不应该是sizeof(int)吧
还有
pData=new char[m_nSize];

这句话你要是当成字符串的话,应该改成
pData=new char[m_nSize+1];
jessenee 2003-10-22
  • 打赏
  • 举报
回复
我的实际代码很复杂,我想把n个类中的数据连在一起,但是有几个类中有可变长的字符串,参考下面的例子:

class Data1
{
public:
int m_nSize;
char* pData;
Data1(char* str);
~Data1();
};
class Data2
{
public:
int m_nSize;
int a;
int b;
char c;
short d;
~Data2();
Data2();
};

Data1::Data1(char* str)
{
m_nSize=strlen(str);
pData=new char[m_nSize+1];
strcpy(pData,str);
}
Data1::~Data1()
{
delete []pData;
}

有n个类似上面的类。

class MyClass
{
Data1 *pData1;
Data2 *pData2;
public:
int m_nSize;
char* pData;
MyClass();
~MyClass();
};
MyClass::MyClass()
{
//得到str
pData1=new Data1(str);
pData2=new Data2();
m_nSize=Data1.m_nSize+Data2.m_nSize;
pData=new char[m_nSize];
int nCurrSize=0;
memcpy(pData, Data1.pData, Data1.m_nSize);
nCurrSize+=Data1.m_nSize;
memcpy(pData+m_nSize,Data2.a,sizeof(int));
//拷贝其他数据
}
MyClass::~MyClass()
{
delete []pData;
}

实际运行的时候没问题,但是调试的时候运行到delete []pData之后就会发生异常。
jessenee 2003-10-21
  • 打赏
  • 举报
回复
link.exe!_CrtIsValidHeapPointer(const void * pUserData=0x03144c88) 行1807
是运行到这个函数的时候退出的,为什么啊?
jessenee 2003-10-21
  • 打赏
  • 举报
回复
郁闷死我了,怎么都不行!!!!!!!!
jessenee 2003-10-21
  • 打赏
  • 举报
回复
对不起,我的构造和析构不是private,我写错了
ahacrazydragon 2003-10-21
  • 打赏
  • 举报
回复
你错在将构造函数和析构函数的属性设为private,class的默认属性为private,
并且析构函数最好这样写:
MyClass::~MyClass()
{
if( p_Msg != NULL )
{
delete[] p_Msg;
p_Msg = NULL;
}
}
并且class的声明不要带括号
FlyingFox007 2003-10-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
//#include "iostream.h"
#include "string"
class MyClass
{
int m_nSize;
char *p_Msg;
public:
MyClass(int size);
~MyClass();
};

MyClass::MyClass(int size)
{
p_Msg=new char[size];
char a[]="12345";
strcpy(p_Msg,a);
}

MyClass::~MyClass()
{
delete p_Msg;
}

int main(int argc, char* argv[])
{
MyClass t(6);

return 0;
}

没有发现错误啊,唯一注意的应该是内存分配,也就是构造函数中的参数应该比你要strcpy的字符数大,否则删除的时候会发生内存报错。最好这样做:
p_Msg=new char[strlen(a)+1];
jessenee 2003-10-21
  • 打赏
  • 举报
回复
HEAP[link.exe]: Heap block at 03154B60 modified at 03154B8D past requested size of 25
link.exe 中的 0x77fa144b 处未处理的异常:用户断点 。
只有这些提示,高手帮忙了,我很急
加载更多回复(3)

64,282

社区成员

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

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