new 的问题啊

a2471388918 2013-08-22 02:07:25
#include <iostream>
#include <cstring>
using namespace std;
int main (){
char *p;
char a[20]="dsfdsfds";
p=new char[20];
strcpy(p,a);
cout<<endl<<p<<endl;
delete []p;
p=new char;
p='\0';
cout<<p;
return 0;
}
假如有这个程序,如果会出现什么错误,(编译时没出错的)我的猜想是字符赋给一个指针变量,然后最后也没有delete p;还有点问题我想问的是 如果p=char [1];是delete p;还是delete []p;
...全文
265 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2013-08-24
  • 打赏
  • 举报
回复
引用 15 楼 ri_aje 的回复:
[quote=引用 14 楼 max_min_ 的回复:] [quote=引用 13 楼 mougaidong 的回复:] 首先,你这个例子证明不了都行。 其次,看看这个链接,这种问题都烂掉了。 [quote=引用 12 楼 max_min_ 的回复:] [quote=引用 11 楼 mougaidong 的回复:] 误人子弟啊 竟然都可以 [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
[/quote]

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char *p = new char[1];
    printf(" ======new p   ok!\n");
    delete  p;  
    printf(" ======delete p ok!\n");

    char *q = new char[1];
    printf(" ======new q    ok!\n");
    delete [] q;
    printf(" ======delete q ok!\n");

    return 0;
}
//结果
 ======new p   ok!
 ======delete p ok!
 ======new q    ok!
 ======delete q ok!

可以说说你的看法,我也只是新手,测试没问题的[/quote][/quote] 看了下, 对于单个字节我感觉应该是可以的! 那上面的是结构体数组肯定旧不一样了! 这里是 char *p = new char [1]; 即使delete p 也不会有上面说的内存泄漏问题的, 我感觉![/quote] 童鞋,编程不是靠感觉的。退一步说,如果你非得靠感觉编程,请别鼓励别人也这么干,毁人啊。 the standard says one new is to be paired with one delete, and one new[] with one delete[],anything else is undefined. period.[/quote] 多谢大神回复!学习了,我会更一步改进自己的编程想法! 因为也是新手,好多东西懂的皮毛!多谢啦啦!!
ri_aje 2013-08-23
  • 打赏
  • 举报
回复
引用 14 楼 max_min_ 的回复:
[quote=引用 13 楼 mougaidong 的回复:] 首先,你这个例子证明不了都行。 其次,看看这个链接,这种问题都烂掉了。 [quote=引用 12 楼 max_min_ 的回复:] [quote=引用 11 楼 mougaidong 的回复:] 误人子弟啊 竟然都可以 [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
[/quote]

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char *p = new char[1];
    printf(" ======new p   ok!\n");
    delete  p;  
    printf(" ======delete p ok!\n");

    char *q = new char[1];
    printf(" ======new q    ok!\n");
    delete [] q;
    printf(" ======delete q ok!\n");

    return 0;
}
//结果
 ======new p   ok!
 ======delete p ok!
 ======new q    ok!
 ======delete q ok!

可以说说你的看法,我也只是新手,测试没问题的[/quote][/quote] 看了下, 对于单个字节我感觉应该是可以的! 那上面的是结构体数组肯定旧不一样了! 这里是 char *p = new char [1]; 即使delete p 也不会有上面说的内存泄漏问题的, 我感觉![/quote] 童鞋,编程不是靠感觉的。退一步说,如果你非得靠感觉编程,请别鼓励别人也这么干,毁人啊。 the standard says one new is to be paired with one delete, and one new[] with one delete[],anything else is undefined. period.
max_min_ 2013-08-23
  • 打赏
  • 举报
回复
引用 13 楼 mougaidong 的回复:
首先,你这个例子证明不了都行。 其次,看看这个链接,这种问题都烂掉了。 [quote=引用 12 楼 max_min_ 的回复:] [quote=引用 11 楼 mougaidong 的回复:] 误人子弟啊 竟然都可以 [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
[/quote]

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char *p = new char[1];
    printf(" ======new p   ok!\n");
    delete  p;  
    printf(" ======delete p ok!\n");

    char *q = new char[1];
    printf(" ======new q    ok!\n");
    delete [] q;
    printf(" ======delete q ok!\n");

    return 0;
}
//结果
 ======new p   ok!
 ======delete p ok!
 ======new q    ok!
 ======delete q ok!

可以说说你的看法,我也只是新手,测试没问题的[/quote][/quote] 看了下, 对于单个字节我感觉应该是可以的! 那上面的是结构体数组肯定旧不一样了! 这里是 char *p = new char [1]; 即使delete p 也不会有上面说的内存泄漏问题的, 我感觉!
turing-complete 2013-08-23
  • 打赏
  • 举报
回复
首先,你这个例子证明不了都行。 其次,看看这个链接,这种问题都烂掉了。
引用 12 楼 max_min_ 的回复:
[quote=引用 11 楼 mougaidong 的回复:] 误人子弟啊 竟然都可以 [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
[/quote]

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char *p = new char[1];
    printf(" ======new p   ok!\n");
    delete  p;  
    printf(" ======delete p ok!\n");

    char *q = new char[1];
    printf(" ======new q    ok!\n");
    delete [] q;
    printf(" ======delete q ok!\n");

    return 0;
}
//结果
 ======new p   ok!
 ======delete p ok!
 ======new q    ok!
 ======delete q ok!

可以说说你的看法,我也只是新手,测试没问题的[/quote]
max_min_ 2013-08-23
  • 打赏
  • 举报
回复
引用 11 楼 mougaidong 的回复:
误人子弟啊 竟然都可以 [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
[/quote]

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char *p = new char[1];
    printf(" ======new p   ok!\n");
    delete  p;  
    printf(" ======delete p ok!\n");

    char *q = new char[1];
    printf(" ======new q    ok!\n");
    delete [] q;
    printf(" ======delete q ok!\n");

    return 0;
}
//结果
 ======new p   ok!
 ======delete p ok!
 ======new q    ok!
 ======delete q ok!

可以说说你的看法,我也只是新手,测试没问题的
turing-complete 2013-08-23
  • 打赏
  • 举报
回复
误人子弟啊 竟然都可以
引用 1 楼 max_min_ 的回复:
编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
lm_whales 2013-08-23
  • 打赏
  • 举报
回复
引用 9 楼 suncc1991 的回复:
最后两行可以直接这样写的吧 p=new char('\0'); //直接申请一个字节并用‘\0’初始化 delete p;
++ p='\0'; 这个是错误的。 *p='\0'; 才对 你是想这么做么??? p=new char('\0'); //直接申请一个字节并用‘\0’初始化 cout<<p; delete p; 这样就可以了!
suncc1991ly 2013-08-22
  • 打赏
  • 举报
回复
最后两行可以直接这样写的吧 p=new char('\0'); //直接申请一个字节并用‘\0’初始化 delete p;
a2471388918 2013-08-22
  • 打赏
  • 举报
回复
引用 6 楼 rocktyt2 的回复:
[quote=引用 4 楼 a2471388918 的回复:] [quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 a2471388918 的回复:] [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
狗哥,那为什么字符'\n'可以赋值给指针变量[/quote] 每个字符串结尾都有个一个字节位置来存放‘\0’ 这些都是转义字符,都是占一个字节的阿! 肯定可以啦[/quote]但是类型不同的啊,‘\0’是字符啊,p是指针变量[/quote]实在是看不下去…… '\0’是char型的0,赋给指针相当于NULL 不要用这种写法 如果赋一个'\n’,不去用它程序也不会报错,如果要用肯定立马崩溃 还有,你要问的问题到底是什么?是用delete还是delete[]吗?这种情况是没关系但是养成new[]对应delete[],不管是什么类型或者长度是多少肯定不会有错[/quote]我是看书上说的,学习 了。哥们谢谢了
max_min_ 2013-08-22
  • 打赏
  • 举报
回复
引用 6 楼 rocktyt2 的回复:
[quote=引用 4 楼 a2471388918 的回复:] [quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 a2471388918 的回复:] [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
狗哥,那为什么字符'\n'可以赋值给指针变量[/quote] 每个字符串结尾都有个一个字节位置来存放‘\0’ 这些都是转义字符,都是占一个字节的阿! 肯定可以啦[/quote]但是类型不同的啊,‘\0’是字符啊,p是指针变量[/quote]实在是看不下去…… '\0’是char型的0,赋给指针相当于NULL 不要用这种写法 如果赋一个'\n’,不去用它程序也不会报错,如果要用肯定立马崩溃 还有,你要问的问题到底是什么?是用delete还是delete[]吗?这种情况是没关系但是养成new[]对应delete[],不管是什么类型或者长度是多少肯定不会有错[/quote] 学习了!真心不知道 '\0'是 char类型的 0型,
rocktyt 2013-08-22
  • 打赏
  • 举报
回复
引用 4 楼 a2471388918 的回复:
[quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 a2471388918 的回复:] [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
狗哥,那为什么字符'\n'可以赋值给指针变量[/quote] 每个字符串结尾都有个一个字节位置来存放‘\0’ 这些都是转义字符,都是占一个字节的阿! 肯定可以啦[/quote]但是类型不同的啊,‘\0’是字符啊,p是指针变量[/quote]实在是看不下去…… '\0’是char型的0,赋给指针相当于NULL 不要用这种写法 如果赋一个'\n’,不去用它程序也不会报错,如果要用肯定立马崩溃 还有,你要问的问题到底是什么?是用delete还是delete[]吗?这种情况是没关系但是养成new[]对应delete[],不管是什么类型或者长度是多少肯定不会有错
max_min_ 2013-08-22
  • 打赏
  • 举报
回复
引用 4 楼 a2471388918 的回复:
[quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 a2471388918 的回复:] [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
狗哥,那为什么字符'\n'可以赋值给指针变量[/quote] 每个字符串结尾都有个一个字节位置来存放‘\0’ 这些都是转义字符,都是占一个字节的阿! 肯定可以啦[/quote]但是类型不同的啊,‘\0’是字符啊,p是指针变量[/quote] 这是因为是'\0'是字符串结束符的,转义字符 ,你改成变得字符'a'这样,赋值就会有问题的!
a2471388918 2013-08-22
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:
[quote=引用 2 楼 a2471388918 的回复:] [quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
狗哥,那为什么字符'\n'可以赋值给指针变量[/quote] 每个字符串结尾都有个一个字节位置来存放‘\0’ 这些都是转义字符,都是占一个字节的阿! 肯定可以啦[/quote]但是类型不同的啊,‘\0’是字符啊,p是指针变量
max_min_ 2013-08-22
  • 打赏
  • 举报
回复
引用 2 楼 a2471388918 的回复:
[quote=引用 1 楼 max_min_ 的回复:] 编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
狗哥,那为什么字符'\n'可以赋值给指针变量[/quote] 每个字符串结尾都有个一个字节位置来存放‘\0’ 这些都是转义字符,都是占一个字节的阿! 肯定可以啦
a2471388918 2013-08-22
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!
狗哥,那为什么字符'\n'可以赋值给指针变量
max_min_ 2013-08-22
  • 打赏
  • 举报
回复
编译没有错,运行出错,一般都是段错误啦! 修改了只读空间,字符串越界操作这些! p = new char[1]; delete p ; delete []p; //都可以的!

64,661

社区成员

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

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