草庐IT

example-new

全部标签

c++ - 了解 new-handler 的行为

我正在阅读ScottMeyers的EffectiveC++55,并且有一个来自第49条的问题:当operatornew无法满足内存请求时,它会调用重复new-handler函数,直到找到足够的内存。设计良好的newhandler函数必须执行以下操作之一:提供更多可用内存。安装不同的新处理程序。卸载新的处理程序抛出异常不返回当new无法分配内存时,说明内存不足,问题是newhandler如何以及从哪里分配更多的内存?你能解释一下所有这些步骤吗? 最佳答案 这取决于实现。我可以告诉你我通常的做法:1)新处理程序在启动时分配大量内存作为保

c++ - 了解 new-handler 的行为

我正在阅读ScottMeyers的EffectiveC++55,并且有一个来自第49条的问题:当operatornew无法满足内存请求时,它会调用重复new-handler函数,直到找到足够的内存。设计良好的newhandler函数必须执行以下操作之一:提供更多可用内存。安装不同的新处理程序。卸载新的处理程序抛出异常不返回当new无法分配内存时,说明内存不足,问题是newhandler如何以及从哪里分配更多的内存?你能解释一下所有这些步骤吗? 最佳答案 这取决于实现。我可以告诉你我通常的做法:1)新处理程序在启动时分配大量内存作为保

c++ - C++ 中的 "new (&variable) value;"有什么作用?

假设我在C++程序中有以下代码:Objecta=Object(someParameters);new(&a)Object(someOtherParameters);我的假设是它将a的内容替换为Object(someOtherParameters),避免为声明可能的operator=对象。这是正确的吗? 最佳答案 它叫做placementnew.它在指定内存上调用构造函数,而不是分配新内存。请注意,在这种情况下,您必须在释放分配的内存之前显式调用对象的析构函数。澄清。假设你分配了一些原始内存char*rawMemory=newchar

c++ - C++ 中的 "new (&variable) value;"有什么作用?

假设我在C++程序中有以下代码:Objecta=Object(someParameters);new(&a)Object(someOtherParameters);我的假设是它将a的内容替换为Object(someOtherParameters),避免为声明可能的operator=对象。这是正确的吗? 最佳答案 它叫做placementnew.它在指定内存上调用构造函数,而不是分配新内存。请注意,在这种情况下,您必须在释放分配的内存之前显式调用对象的析构函数。澄清。假设你分配了一些原始内存char*rawMemory=newchar

c++ - 公共(public)算子新建,私有(private)算子删除 : getting C2248 "can not access private member" when using new

一个类有重载的操作符new和delete。new是公开的,delete是私有(private)的。在构造该类的实例时,出现以下错误:pFoo=newFoo(bar)example.cpp(1):错误C2248:'Foo:operatordelete':无法访问在类'Foo'中声明的私有(private)成员但是这里没有调用delete,那么编译器扭曲的头脑中发生了什么?:)错误的原因是什么?是否可以在不借助成员CreateInstance函数的情况下解决问题? 最佳答案 当您执行newFoo()时,会发生两件事:首先调用operat

c++ - 公共(public)算子新建,私有(private)算子删除 : getting C2248 "can not access private member" when using new

一个类有重载的操作符new和delete。new是公开的,delete是私有(private)的。在构造该类的实例时,出现以下错误:pFoo=newFoo(bar)example.cpp(1):错误C2248:'Foo:operatordelete':无法访问在类'Foo'中声明的私有(private)成员但是这里没有调用delete,那么编译器扭曲的头脑中发生了什么?:)错误的原因是什么?是否可以在不借助成员CreateInstance函数的情况下解决问题? 最佳答案 当您执行newFoo()时,会发生两件事:首先调用operat

c++ - 为什么当 int array[n] 无效时 new int[n] 有效?

对于以下代码:foo(intn){intarray[n];}我了解这是无效的语法,并且它是无效的,因为c++标准要求在编译时设置数组大小(尽管某些编译器支持以下语法)。但我也理解以下是有效的语法:bar(intn){int*array=newint[n];}我不明白为什么允许这样做,这与创建一个在运行时确定大小的数组不一样吗?这样做是一种好习惯,或者如果我需要这样做,我应该使用vector吗? 最佳答案 这是因为前者分配在栈上,而后者分配在堆上。当您在堆栈上分配某些东西时,了解对象的大小对于正确构建它至关重要。C99允许在运行时指定

c++ - 为什么当 int array[n] 无效时 new int[n] 有效?

对于以下代码:foo(intn){intarray[n];}我了解这是无效的语法,并且它是无效的,因为c++标准要求在编译时设置数组大小(尽管某些编译器支持以下语法)。但我也理解以下是有效的语法:bar(intn){int*array=newint[n];}我不明白为什么允许这样做,这与创建一个在运行时确定大小的数组不一样吗?这样做是一种好习惯,或者如果我需要这样做,我应该使用vector吗? 最佳答案 这是因为前者分配在栈上,而后者分配在堆上。当您在堆栈上分配某些东西时,了解对象的大小对于正确构建它至关重要。C99允许在运行时指定

c++ - 我怎样才能明智地重载放置运算符 new?

C++允许重载operatornew-全局和每个类-通常的operatornew、operatornew[]与一起使用new[]语句和放置operatornew分开。这三个中的前两个通常因使用自定义分配器和添加跟踪而被重载。但是放置operatornew似乎很简单——它实际上在内部什么都不做。例如,在VisualC++中,默认实现只返回传递给调用的地址://fromnew.hinlinevoid*operatornew(size_t,void*where){returnwhere;}它还能做什么?为什么以及如何合理地重载放置operatornew? 最佳答案

c++ - 我怎样才能明智地重载放置运算符 new?

C++允许重载operatornew-全局和每个类-通常的operatornew、operatornew[]与一起使用new[]语句和放置operatornew分开。这三个中的前两个通常因使用自定义分配器和添加跟踪而被重载。但是放置operatornew似乎很简单——它实际上在内部什么都不做。例如,在VisualC++中,默认实现只返回传递给调用的地址://fromnew.hinlinevoid*operatornew(size_t,void*where){returnwhere;}它还能做什么?为什么以及如何合理地重载放置operatornew? 最佳答案