学习C++笔记356

简介: C++ 动态内存

new 和 malloc 内部的实现方式有什么区别?

new 的功能是在堆区新建一个对象,并返回该对象的指针。

所谓的【新建对象】的意思就是,将调用该类的构造函数,因为如果不构造的话,就不能称之为一个对象。

而 malloc 只是机械的分配一块内存,如果用 mallco 在堆区创建一个对象的话,是不会调用构造函数的。

严格说来用 malloc 不能算是新建了一个对象,只能说是分配了一块与该类对象匹配的内存而已,然后强行把它解释为【这是一个对象】,按这个逻辑来,也不存在构造函数什么事。

同样的,用 delete 去释放一个堆区的对象,会调用该对象的析构函数。

用 free 去释放一个堆区的对象,不会调用该对象的析构函数。

做个简单的实验即可明了:

#include

#include


class TEST

{

private:

   int num1;

   int num2;

public:

   TEST()

   {

       num1 =10;

       num2 =20;

   }

   voidPrint()

   {

       std::cout << num1 <<" "<< num2 << std::endl;

   }

};


int main(void)

{

   // 用malloc()函数在堆区分配一块内存空间,然后用强制类型转换将该块内存空间

   // 解释为是一个TEST类对象,这不会调用TEST的默认构造函数

   TEST * pObj1 =(TEST *)malloc(sizeof(TEST));

   pObj1->Print();


   // 用new在堆区创建一个TEST类的对象,这会调用TEST类的默认构造函数

   TEST * pObj2 =new TEST;

   pObj2->Print();


   return0;

}

/*

运行结果:


-----------------------------

-842150451 -842150451       |

10 20                       |

请按任意键继续. . .         |

-----------------------------


我们可以看到pObj1所指的对象中,字段num1与num2都是垃圾值

而pObj2所指的对象中,字段num1与num2显然是经过了构造后的值

*/

目录
相关文章
|
1天前
|
算法 数据处理 C++
|
23小时前
|
C++
C++基础知识(四:类的学习)
类指的就是对同一类对象,把所有的属性都封装起来,你也可以把类看成一个高级版的结构体。
|
1天前
|
算法 C++ 容器
|
1天前
|
存储 调度 C++
|
20小时前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
20小时前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
20小时前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。