51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 830|回复: 3
打印 上一主题 下一主题

有关在C++中内存使用的思考(一)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-2-8 11:13:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下有四部分代码,分别为了实现相同的功能:分配内存,并且使用之。但结果却不同。
Part 1

void GetMemory(char *p)
{
        p = (char *)malloc(100);
}
void Test(void)
{
        char *str = NULL;
        GetMemory(str);
        strcpy(str, "hello world");
        printf(str);
}

请问运行Test函数会有什么样的结果?
结果是:程序崩溃。
因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2006-2-8 11:15:35 | 只看该作者

有关在C++中内存使用的思考(二)

char *GetMemory(void)
{       
        char p[] = "hello world";
        return p;
}
void Test(void)
{
        char *str = NULL;
        str = GetMemory();
        printf(str);
}

请问运行Test函数会有什么样的结果?
结果是:可能是乱码。
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2006-2-8 11:18:28 | 只看该作者

有关在C++中内存使用的思考(三)

void GetMemory2(char **p, int num)
{
        *p = (char *)malloc(num);
}
void Test(void)
{
        char *str = NULL;
        GetMemory(&str, 100);
        strcpy(str, "hello");       
        printf(str);
}
请问运行Test函数会有什么样的结果?
结果是:(1)能够输出hello
                (2)内存泄漏
因为每次使用完Test之后都没有释放str。
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2006-2-8 11:21:38 | 只看该作者

有关在C++中内存使用的思考(四)

void Test(void)
{
        char *str = (char *) malloc(100);
        strcpy(str, “hello”);
        free(str);
        if(str != NULL)
        {
          strcpy(str, “world”);
                       printf(str);
        }
}
请问运行Test函数会有什么样的结果?
结果是:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用。关键就在于free函数的位置放错了。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-8 18:32 , Processed in 0.062682 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表