template <class U>
void operator()(U* ptr) const;
|
在 ptr 上调用 delete[] 。此函数仅若 U(*)[] 能隐式转换为 T(*)[] 才参与重载决议。任何情况下,若 U 是不完整类型,则程序为谬构。
仅为 default_delete<T[]> 模板特化的成员
ptr:要删除的对象或数组
#include <memory>
#include <vector>
#include <algorithm>
int main()
// {
// std::shared_ptr<int> shared_bad(new int[10]);
// } // 析构函数调用 delete ,未定义行为
std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>
} // 析构函数调用 delete[] , ok
std::unique_ptr<int> ptr(new int(5));
} // unique_ptr<int> 使用 default_delete<int>
std::unique_ptr<int[]> ptr(new int[10]);
} // unique_ptr<int[]> 使用 default_delete<int[]>
// default_delete 能用于需要删除用函数对象的任何场所
std::vector<int*> v;
for(int n = 0; n < 100; ++n)
v.push_back(new int(n));
std::for_each(v.begin(), v.end(), std::default_delete<int>());
当类中含有不能
默认
初始化的成员变量时,可以禁止
默认
构造函数的生成,
myClass()=
delete
;//表示删除
默认
构造函数
myClass()=
default
;//表示
默认
存在构造函数
当类中含有不能
默认
拷贝成员变量时,可以禁止
默认
构造函数的生成,
myClass(const myClass&)=
delete
;//表示删除
默认
拷贝构造函数,即不能进行
默认
拷贝
myClass & op
=
default
表示使用编译器为我们提供的实现,=
delete
表示删除函数,不实现。
=
default
=
delete
一般只能用在编译器为我们生成的函数上,比如构造函数,拷贝构造,析沟函数(不要使用=
delete
),赋值等。
=
delete
可以用在普通成员函数,但是没有意义。=
delete
修饰析构函数时,无法进行释放对象,因此无法生成临时变量,无法进行
delete
,也无法当作父类。
下面进行测试:
struct Complex
C++
11
中,当类中含有不能
默认
初始化的成员变量时,可以禁止
默认
构造函数的生成
myClass()=
delete
;//表示删除
默认
构造函数
myClass()=
default
;//表示
默认
存在构造函数
当类中含有不能
默认
拷贝成员变量时,可以禁止
默认
构造函数的生成
myClass(const myClass&)=
delete
;//表示删除
默认
拷贝构造函数,即不能进行
默认
拷贝
myClass & operatir=(const myClass&)=
delete
;//表示删除
默认
拷
C++
11
为了增强对类
默认
函数的控制,从而让程序员更加精准地去控制
默认
版本的函数,引入了两种新特性:
default
:
显式缺省,告知编译器生成函数
默认
的缺省版本
delete
:
显式删除,告知编译器不生成函数
默认
的缺省版本
二、
default
若我们在类中实现了上述函数之
Microsoft
C++
异常
std
:
:
bad_alloc 是一种内存分配失败的异常。在 Visual
C++
.NET 2002 中,标准
C++
库中的 new 功能将支持
C++
标准中指定的行为,如果内存分配失败,则会引发
std
:
:
bad_alloc 异常。同时,C 运行库的 new 函数也会引发相同的异常。
在你提供的引用中的代码中,异常捕获了
std
:
:
exception 类型的异常,并输出了异常信息。而在引用中,程序抓到了
std
:
:
bad_alloc 异常,这意味着系统无法分配所需的内存。
通常情况下,当系统内存不足时,可能会导致
std
:
:
bad_alloc 异常的发生。在你的例子中,通过查看任务管理器,发现内存已经占用了1.5G,这可能是导致内存分配失败的原因之一。
为了解决这个问题,你可以尝试释放一些内存资源,或者优化你的代码以减少内存的使用。另外,你还可以使用 try-catch 块来捕获并处理
std
:
:
bad_alloc 异常,以便在发生异常时采取相应的措施,比如显示错误信息或进行内存清理操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [详解
C++
中new运算符和
delete
运算符的使用](https
:
//download.csdn.net/download/weixin_38571603/14874772)[target="_blank" data-report-click={"spm"
:
"1018.2226.3001.9630","extra"
:
{"utm_source"
:
"vip_chatgpt_common_search_pc_result","utm_medium"
:
"distribute.pc_search_result.none-task-cask-2~all~insert_cask~
default
-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width
:
50%"]
- *2* *3* [
c++
std
:
:
bad_alloc异常问题排查](https
:
//blog.csdn.net/sevendemage/article/details/126408227)[target="_blank" data-report-click={"spm"
:
"1018.2226.3001.9630","extra"
:
{"utm_source"
:
"vip_chatgpt_common_search_pc_result","utm_medium"
:
"distribute.pc_search_result.none-task-cask-2~all~insert_cask~
default
-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width
:
50%"]
[ .reference_list ]
Golang:go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘
45576 阅读
|