注册 登录
编程论坛 C++教室

new的问题?

newyj 发布于 2008-10-09 20:04, 1402 次点击
#include<iostream>
using namespace std;
char* newfuc(const char*,const char*);

int main()
{
  char* pi="perfect ";
  char* pj="c++!";
  cout<<newfuc(pi,pj)<<endl;
  getchar();
  return 0;
}

char* newfuc(const char* i,const char* j)
{
  char* ptr=new char[strlen(i)+strlen(j)+1]; //[]中的数 不管是多少都能正确输出,为什么? 甚至不定义为数组也能正确输出.
  strcpy(ptr,i);
  strcat(ptr,j);
  return ptr; //不是说 不能返回函数中的局部指针和引用吗? 那为什么这样可以呢? (希望我没记错)
}
17 回复
#2
很远的那颗星2008-10-09 21:26
return ptr; //不是说 不能返回函数中的局部指针和引用吗? 那为什么这样可以呢? (希望我没记错)
你使用的是动态存储分配,使用的是堆内存...这个是要手动释放的..即delete ...
否则它将直到main()结束时才释放...er~~希望我也没记错...
#3
blueboy820062008-10-09 22:05
LZ明显的内存泄漏了....
要释放ptr的...
之所以能返回就是因为你没释放,所以它的生命周期也没结束吧...
#4
newyj2008-10-09 22:05
哦 谢谢了
什么是 内存泄露啊?  我这个 代码 那里 内存泄露啊?
那 动态 分配的 []中的数 不管是多少都能正确输出,为什么? 甚至不定义为数组也能正确输出

[[it] 本帖最后由 newyj 于 2008-10-9 22:06 编辑 [/it]]
#5
blueboy820062008-10-09 22:06
例如?
#6
newyj2008-10-09 22:07
char* ptr=new char[strlen(i)+strlen(j)+1];  
就是这句啊
#7
blueboy820062008-10-09 22:07
我想你不定义为数组也能输出的,无非是开一个变量的空间的那种情况吧.....
#8
blueboy820062008-10-09 22:08
哦,不好意思,我没看程序中的问题...
我看一下..
#9
newyj2008-10-09 22:17
那我在 main函数中delete ptr 不知道 能否 释放掉
#10
blueboy820062008-10-09 22:18
我说一下哈,
你nwefuc函数中的,char* ptr=new char[strlen(i)+strlen(j)+1];
动态分配空间却没释放,系统是不会自动为你释放的,这就是内存泄漏...
因为你只分配内存却不回收,这样操作多了,内存就会耗尽,系统会崩溃....
建议你找些这方面的资料看一下...
#11
blueboy820062008-10-09 22:19
[bo][un]newyj[/un] 在 2008-10-9 22:17 的发言:[/bo]

那我在 main函数中delete ptr 不知道 能否 释放掉

ptr可是局部变量哦...
main中不可见...
#12
newyj2008-10-09 22:25
不是说 它 是一直存在的吗?
char* ptr=new char[strlen(i)+strlen(j)+1];这句 要是这样写char* ptr=new char 函数也能 正确执行,为什么呢?
#13
blueboy820062008-10-09 22:32
[bo][un]newyj[/un] 在 2008-10-9 22:25 的发言:[/bo]

不是说 它 是一直存在的吗?
char* ptr=new char[strlen(i)+strlen(j)+1];这句 要是这样写char* ptr=new char 函数也能 正确执行,为什么呢?

是strcpy();
运行时自动分配了足够的空间吧...
这个,这学的时候是不应该的啊!strcpy()此时应该是一个运行时错误的...
#14
newyj2008-10-09 23:03
但是 并没有 错误提示啊
#15
blueboy820062008-10-09 23:32
回复 14# newyj 的帖子
可能这样也行吧...
等我研究研究....
#16
song42008-10-10 08:55
char* ptr=new char[strlen(i)+strlen(j)+1]; //[]中的数 不管是多少都能正确输出,为什么? 甚至不定义为数组也能正确输出

头都大了  说什么我都没看明白
看我说的是不是你问的
你是char* ptr  所以返回的是个指针
而这个指针里放的是一个地址
然后你strcpy(ptr,i);
  strcat(ptr,j);
只是往这个地址里写东西  虽然你char* ptr  =new char;也对
但当你读取时人家系统按字符串读取 只看最后的/0在哪  人家也不知道你指针有多大
而你strcat(ptr,j);正好把/0放进去了
所以 你这个只申请一个CHAR空间的指针在(CHAR后面空间 没有人用的情况下)勉强可以通过运行的
是这么 说么?
#17
newyj2008-10-10 21:51
要是 char* ptr=new char 申请个 指针 指向char类型
再 strcpy(ptr,i);  strcat(ptr,j); 最后 我 再 flush 清 一下缓冲区 那输出的是什么呢?
#18
orangecy2008-10-12 09:45
你不是想把Ij字符串放到ptr上吗,你用new分配的空间刚刚够 不论你的ij越大,new分配的空间越大,你的ptr容量越大。所以一直够用
1