删除空数组

zyyeung 2011-03-28 04:31:45

//class 定义
class CBuffer
{
public:
int pos;
char buf[0];
public:
CBuffer()
{
memset(this,0,sizeof(CBuffer));
}
void addBuf(char *data,int len)
{
memcpy(buf+pos,data,len);
pos+=len;
}
protected:
private:
};

//调用
CBuffer *buf = new CBuffer;
char *data="1234567890";
int len=strlen(data);
buf->addBuf(data,len);
printf("%s\n",buf->buf);
delete buf; //err - 1
buf = NULL;

//err -1
void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock ); //定位
}


请高手解释下错误原因。

另外空数组内存如何正确释放?
...全文
240 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bEst_02 2011-03-29
  • 打赏
  • 举报
回复
因为类中的buf,没有实际分配空间,在运行时其只想栈空间,当使用memcpy时,把栈上原本的数据修改了,所以提示damage框,在release下是不会提示的。只要copy的数据不破坏ret值,运行都可以通过的。
fendouzhe 2011-03-29
  • 打赏
  • 举报
回复
什么是柔性数组?
昵称很不好取 2011-03-28
  • 打赏
  • 举报
回复
楼主想使用柔性数组? 小改了下代码,大致示例如下,希望能有所帮助
class CBuffer
{
public:
struct s{
int pos;
char buf[0];
};
struct s *ps;
public:
CBuffer()
{
ps = (struct s*)malloc(sizeof(s) + 128);
ps->pos = 0;
memset(ps->buf,0,128);
}
~CBuffer()
{
free(ps);
}
void addBuf(const char *data,int len)
{
memcpy(ps->buf + ps->pos,data,len);
ps->pos+=len;
}
};

int main()
{
CBuffer *buf = new CBuffer;
const char *data="1234567890";
int len=strlen(data);
buf->addBuf(data,len);
printf("%s\n",buf->ps->buf);
delete buf;
buf = NULL;

return 0;
}
CppCoder 2011-03-28
  • 打赏
  • 举报
回复
把char buf[0];改为char *pszBuf;

void addBuf(char *data,int len)
开辟内存,复制数据

析构函数
delete [] pszBuf;
pengzhixi 2011-03-28
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

class CBuffer
{
public:
int pos;
char buf[0];

public:
CBuffer()
{
memset(this,0,sizeof(CBuffer));
}
void addBuf(char *data,int len)
{
memcpy(buf-4,data,len);
//pos+=len;
}
protected:
private:
};


int main()
{
cout<<sizeof(CBuffer)<<endl;
CBuffer *buf1 = new CBuffer;
char *data="123";
int len=strlen(data);
buf1->addBuf(data,len);
printf("%s\n",buf1->buf-4);
delete buf1; //err - 1
buf1 = NULL;

system("pause");
return 0;
}
给你一个版本
寒冰雪 2011-03-28
  • 打赏
  • 举报
回复
零长数组在开始时没有分配空间。。类的大小仅是int的大小。。

然后memcpy操作了类以外的内存。。在delete时出错。。
pengzhixi 2011-03-28
  • 打赏
  • 举报
回复
问题1: char *data="1234567890";//字符串太长了,而你的CBuffer *buf 指向的内存才多大呢?

问题2:memcpy(buf+pos,data,len);//buf+pos;这个已经是越界了。你pos里面不在为0,而是存放了new 返回的地址值

pos+=len;//没事你干嘛修改pos里面的值,你一修改那么delete释放的地址值就变了。
namewchwch 2011-03-28
  • 打赏
  • 举报
回复
void addBuf(char *data,int len)
{
memcpy(buf+pos,data,len);///buf指针没有指向可用内存,如何将东西拷贝进去?,pos没有初始化,如
pos+=len; ///如何能直接将buf加上pos。这个一加 就指向位置区域。
}

类 没有析够函数。delete只会默认析够。

64,686

社区成员

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

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