海珠网站建设制作,小程序定制开发外包风险,厦门网站建设找哪家,高端网站制使用new时调用构造函数使用delete时调用析构函数
构造函数
使用new动态分配内存时#xff0c;如果分配的是基本类型的内存#xff0c;则不会调用构造函数。如果分配的是自定义类型的内存#xff0c;则会调用构造函数进行对象的初始化。
例如#xff1a;
int* pInt new…使用new时调用构造函数使用delete时调用析构函数
构造函数
使用new动态分配内存时如果分配的是基本类型的内存则不会调用构造函数。如果分配的是自定义类型的内存则会调用构造函数进行对象的初始化。
例如
int* pInt new int; // 不会调用构造函数
class MyClass {
public:MyClass() {cout MyClass constructor is called endl;}
};
MyClass* pObj new MyClass(); // 调用构造函数析构函数
使用delete释放内存时如果内存中存储的是基本类型或者使用new分配内存时发生了错误导致没有成功创建对象则不会调用析构函数否则会调用析构函数进行资源的释放。
例如
int* pInt new int;
// 使用pInt
delete pInt; // 不会调用析构函数class MyClass {
public:MyClass() {cout MyClass constructor is called endl;}~MyClass() {cout MyClass destructor is called endl;}
};
MyClass* pObj new MyClass();
// 使用pObj
delete pObj; // 调用析构函数
pObj NULL;需要注意的是使用new分配的内存必须在不再使用时通过delete操作符进行释放否则会造成内存泄漏。
同时为了避免悬垂指针的问题在删除指针之前必须将指针置为nullptr。 在C中delete只是释放了指针指向的内存空间但是并没有将指针本身变成nullptr空指针。 这也就意味着如果在delete后不将指针制空那么这个指针仍然指向之前释放的那块内存空间访问它将会产生未定义行为UB。
因此在使用delete释放动态分配的内存后最好将指针置为nullptr这样能够避免悬垂指针的问题。
例如
int *pInt new int;
//使用pInt
delete pInt;
pInt nullptr; // 将指针置为nullptr需要注意的是将指针置为nullptr只是一种好习惯而非强制要求。如果你后续没有再次使用该指针或者保证没有悬垂指针的风险那么也可以不进行指针置空操作。
nullptr是C11引入的关键字。它用于表示空指针常量可以用于初始化指针或与指针进行比较。
在C之前的版本中通常使用NULL或0来表示空指针。然而这样的表示方式可能会引起一些歧义和问题。为了解决这些问题并提供更明确和类型安全的空指针表示C11引入了nullptr。
使用nullptr可以明确地表示空指针避免在某些上下文中与整数0混淆。另外nullptr还可以作为实现函数重载时的重要工具与其他类型的指针进行区分。
示例用法
int* pInt nullptr; // 初始化指针为空
if (pInt nullptr) {// 执行某些操作
}void foo(int* ptr) {// 实现重载函数
}
void foo(int i) {// 实现重载函数
}foo(nullptr); // 调用第一个foo函数传递空指针常量nullptr是C中的关键字用于明确表示空指针常量提高代码的可读性和类型安全性。 要释放通过new申请的数组需要使用delete[]操作符而不是简单的delete。
示例代码如下
int* pArray new int[10]; // 通过new申请一个int类型的数组// 使用pArraydelete[] pArray; // 释放通过new申请的数组内存
pArray nullptr; // 将指针置为nullptr需要注意以下几点
使用delete[]来释放通过new[]申请的数组内存。在释放数组内存之后将指针置为nullptr是个好习惯可以避免悬垂指针问题。如果使用new[]分配数组时发生了错误没有成功创建数组对象那么在释放数组内存时也不要使用delete[]因为没有成功创建的数组对象不需要释放。
总结起来使用delete[]来释放通过new[]申请的数组内存并将指针置为nullptr