new 与delete的问题.

wansuiwht 2009-05-12 11:23:37
书上遇到的一个例题
char * substring(const char * const s, int start, int end)
{
char * pNewString = new char[end - start + 1];
int j = 0;
for (int i = start, i < end; i++, j++)
pNewString[i] = s[i];

pNewString[j] = '\0\';
retrun pNewString;
}
int main()
{
char *s = "Atlanta, Georgia";
cout << substing(s, 0, 7);
return 0;
}
这个怎么释放动态分配的那个东西啊.在哪用delete;
我刚学到指针这块.还没学到类那呢,这是书上的一个例题,
书上,跟网上,都说,New 与 Delete应该成对出现.这个例子里没有成对出现,只是下面说,应该用delete释放空间,我不知道在哪用这个delete.
...全文
80 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
HelloDan 2009-05-12
  • 打赏
  • 举报
回复

#include<iostream>

using namespace std;

char * substring(const char * const s, int start, int end)
{
char * pNewString = new char[end-start+1];
int j =start;
int i =0;
for (i =0; i<end-start; i++,j++)
pNewString[i]=s[j];

pNewString[i] ='\0';
return pNewString;
}
int main()
{
char *s ="Atlanta, Georgia";
char *str=substring(s, 0, 7);
cout <<s<<endl;
cout<<str<<endl;
delete [] str;
return 0;
}

wansuiwht 2009-05-12
  • 打赏
  • 举报
回复
多谢各位啊.今天分少了,我明天加点分再结贴.
lingyin55 2009-05-12
  • 打赏
  • 举报
回复
因为你的substring中有char * pNewString = new char[end - start + 1];
如果忘记delete就会出错。所以你可以使用传递一个指针参数方法,在调用这个函数的函数(这里即为main)
里面使用new,这样使用完后就可以再main里面释放内存。


[Quote=引用 6 楼 wansuiwht 的回复:]
这个例题后面还有一段话.
警告; 此函数返回的子串是用NEW操作符创建的,因此,函数的使用者必须在使用完子串后用关键字DELETE释放其空间,否则,只要程序还在运行中,字符串就一直存在,一种可能更好的方式是,重新设计函数,将返回的子串作为一个参数传递给函数;函数头如下;
void substring(const char * const s, int start, int end, char * substr)
[/Quote]
老邓 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wansuiwht 的回复:]
这个例题后面还有一段话.
警告; 此函数返回的子串是用NEW操作符创建的,因此,函数的使用者必须在使用完子串后用关键字DELETE释放其空间,否则,只要程序还在运行中,字符串就一直存在,一种可能更好的方式是,重新设计函数,将返回的子串作为一个参数传递给函数;函数头如下;
void substring(const char * const s, int start, int end, char * substr)
[/Quote]
这种设计确实不错。
不过很麻烦。

最好是返回string(如果不跨DLL)
或使用智能指针shared_ptr(不存在DLL问题)
老邓 2009-05-12
  • 打赏
  • 举报
回复
楼主其实可以返回string的,就不用担心内存泄露了。
wansuiwht 2009-05-12
  • 打赏
  • 举报
回复
这个例题后面还有一段话.
警告; 此函数返回的子串是用NEW操作符创建的,因此,函数的使用者必须在使用完子串后用关键字DELETE释放其空间,否则,只要程序还在运行中,字符串就一直存在,一种可能更好的方式是,重新设计函数,将返回的子串作为一个参数传递给函数;函数头如下;
void substring(const char * const s, int start, int end, char * substr)
JY00876789 2009-05-12
  • 打赏
  • 举报
回复
支持一楼
wansuiwht 2009-05-12
  • 打赏
  • 举报
回复
哦,原来要这样用啊.谢谢啊.哈哈.
brookmill 2009-05-12
  • 打赏
  • 举报
回复
int main()
{
char *s = "Atlanta, Georgia";
char *p = substing(s, 0, 7);
cout << p;
delete []p;
return 0;
}
晒月光的青蛙 2009-05-12
  • 打赏
  • 举报
回复
这个要在main函数里面用delete,

int main()
{
char *s = "Atlanta, Georgia";
char *result = substing(s, 0, 7);
cout << result;
delte[] result;
return 0;
}

还有,new,和delete最好放在一个函数里,这个程序最好在main里面new了之后将指针传递到函数里面,指针用完后删除
老邓 2009-05-12
  • 打赏
  • 举报
回复
char *s = "Atlanta, Georgia";
cout < < substing(s, 0, 7);

这样写就内存泄露了。
需要声明一个指针:

char* p = substing(s, 0, 7);
delete [] p;

64,683

社区成员

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

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