美文网首页
林锐高质量C++关于内存的思考题

林锐高质量C++关于内存的思考题

作者: 红枫叶HM | 来源:发表于2022-03-13 21:41 被阅读0次

转载自:http://blog.sina.com.cn/s/blog_6c8304c101014hp9.html

void GetMemory(char *p)

{

p = (char *)malloc(100);

printf("%p\n", p); // 输出:00761770

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

printf("%p\n", str); // 输出:00000000

strcpy(str, "hello world");

printf(str);

}

运行结果:程序崩溃。GetMemory()函数是无法传递动态分配的内存的,所以指针str一直为NULL。

char *GetMemory(void)

{

char p[] = "hello world";

printf("%p\n", p); // 输出:0022FF00

return p;

}

int main(void)

{

char *str =NULL;

str = GetMemory();

printf("%p\n", str); // 输出:0022FF00

printf(str);

}

运行结果:可能输出乱码。此例指针str能获得GetMemory()返回的指针p及其指向的内容;输出乱码是因为指针p是指向栈内存的指针,赋给str时其内存已经被释放,指向的内容也被清空,但指针p仍存在,其任意指向一块内存,此块内存的内容(str获得的内容)不可知。

以上两例可以如下修改:


void GetMemory(char **p)

{

*p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str);

strcpy(str, "hello world");

printf(str);

free(str);// 必须释放,否则会造成内存泄露

}

char *GetMemory(void)

{

char *p =(char *)malloc(100);

return p;

}

int main(void)

{

char *str =NULL;

str = GetMemory();

printf(str);

free(str);

}
int main(void)

{

char *str = (char *)malloc(100);

printf("%p\n", str); // 输出:00591770

strcpy(str, "hello");

free(str); // 错误

printf("%p\n", str); // 输出:00591770

if(str != NULL)

{

strcpy(str, "world");

printf(str);

}

}

运行结果:无法预测。指针str被free后,指针str不为NULL且指向一块不确定的内存,向一块不确定的内存拷贝内容,结果无法预测。

free()的作用:释放为指针动态分配的内存(指针指向的内容被清空,但是指针仍存在)。

相关文章

  • 林锐高质量C++关于内存的思考题

    转载自:http://blog.sina.com.cn/s/blog_6c8304c101014hp9.html[...

  • C++ 内存管理1

    内存管理是我们在编程时经常遇到的问题,而关于内存管理的问题往往会导致我们无从下手,这篇随笔是我阅读《高质量C++》...

  • 第一章 文件结构

    林锐博士的C++高质量代码的读书笔记,在毕业那年找工作的时候给与了很大帮助,即使工作了也很有益处。无意中在本地电脑...

  • c++内存管理

    c++内存管理长文 c++内存管理

  • Java 内存管理

    Java可以自动管理内存,比C/C++要方便的多, 但是实际Java 也会出现内存溢出的问题。 关于Java的内存...

  • 内存管理

    内容包括: C++内存管理 Java内存管理 C++内存管理 内存分配方式 在C++中,内存分成5个区,分别是栈、...

  • C++运算符重载实现(加号、左移、递增、赋值、关系运算符、函数调

    先来复习一下C++的内存分区问题~ C++内存分区 C++程序的内存分区可划分为四大内存分区:堆、栈、全局/静态存...

  • 高质量程序设计笔记

    高质量程序设计指南——C++.C语言(第3版)(修订版)[精品] 林锐 韩永泉 § 1.1 软件质量基本概念 >>...

  • 内存池

    参考资料 C++内存池介绍与经典内存池的实现 C++ 应用程序性能优化,第 6 章:内存池 linux c++ 内...

  • 关于C++内存对齐

    关于C++内存对齐 测试代码如下: instance 的地址为0X0015FE44,如下图所示 在内存中找到该地址...

网友评论

      本文标题:林锐高质量C++关于内存的思考题

      本文链接:https://www.haomeiwen.com/subject/pipddrtx.html