构造函数与析构函数
new 运算符
在 C++ 中,动态内存分配使用 new 运算符。它会在堆(heap)上分配指定大小的内存,并返回指向该内存首地址的指针。分配的对象(或数组)会存活到被 delete 释放为止,而不会因离开作用域自动销毁。
核心用法:new 与 new[]
new char:分配一个字符大小的内存,返回char*。new char[size]:分配size个字符的连续内存块(数组),返回char*(指向第一个元素)。- 注意:如果分配的是数组,则必须使用
new[]形式,后续释放必须对应delete[]。
在构造函数中的使用
1 | class MyString { |
为什么需要区分
new和new[]?这关系到内存布局的底层机制。编译器在分配数组时,会在块头部额外存储元素个数等信息。若使用delete释放new[]创建的内存,行为是未定义的。new必须与delete配对,new[]必须与delete[]配对。
delete 运算符
与 new 对应,delete 运算符用于释放之前通过 new 分配的堆内存。释放后,内存被归还给操作系统,但指针变量本身仍然存在,指向一个无效的地址——这就是悬空指针。
在析构函数中的使用
1 | class MyString { |
C 风格字符串
C 风格字符串是以 '\0'(空字符)结尾的字符数组。处理这类字符串时,必须依赖 strlen 和 strcpy 等标准库函数,它们都依赖于 '\0' 来定位字符串的结束位置。
strlen 示例
1 | char str[] = "hello"; |
strcpy 示例
1 | char src[] = "world"; |
内存分配不足:使用 new char[len] 时,必须分配 len + 1 个字节(为 ‘\0’ 留出空间)。如果只分配 len 个字节,strcpy 会越界写入,导致内存损坏
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 溯境!






