天道酬勤,学无止境

new-operator

Replacing libstdc++.dylib (4.0) global new and delete operators on OSX

I'm trying hard to replace the global new and delete operators with XCode 3.2, GCC 4.2, libstdc++ 4.0, dynamic version. I took the protypes directly from the header "new" and implemented them. They are pasted below. The project is a .plugin so a dynamic lib. This plug-in MUST delegate allocation to the main application's own alloc/free routines, which are in an old C SDK. All my own call to new/delete along with std::list and std::map allocations are correctly replaced, BUT not when std::vector::push_back has to grow its buffer. It that case, my operator new is not called but my operator

2022-01-18 06:00:51    分类:问答    c++   xcode   gcc   stl   new-operator

An error is issued by gcc relative to parsing type-id in a new expression

This program #include <cstddef> int main() { const std::size_t N1 = 2; const std::size_t N2 = 3; int ( **p )[N1] = new ( int ( *[N2] )[N1] ); } does not compile using the compiler C++ gcc HEAD 10.0.0 20190. The compiler issues error prog.cc: In lambda function: prog.cc:8:40: error: expected '{' before ')' token 8 | int ( **p )[N1] = new ( int ( *[N2] )[N1] ); | ^ prog.cc: In function 'int main()': prog.cc:8:34: error: no match for 'operator*' (operand type is 'main()::<lambda()>') 8 | int ( **p )[N1] = new ( int ( *[N2] )[N1] ); prog.cc:8:47: error: expected type-specifier before ';' token 8 |

2022-01-18 04:09:49    分类:问答    c++   pointers   gcc   c++17   new-operator

is the following new overload leaking memory?

I have encountered the following code: class a { public: void * operator new(size_t l, int nb); double values; }; void *a::operator new (size_t l,int n) { return new char[l+ (n>1 ? n - 1 : 0)*sizeof(double)]; } From what I get it is then used to have an array like structure that start at "values": double* Val = &(p->a->values) + fColumnNumber; My question is : is there a memory leak? I am very new to overloading new operator, but I'm pretty sure that the memory allocated is not deallocated properly. Also does that mean I can never create a "a" class on the stack? thanks

2022-01-17 12:40:44    分类:问答    c++   memory-management   operator-overloading   new-operator

Omitting c# new from jagged array initialization

From: http://msdn.microsoft.com/en-us/library/2s05feca.aspx Notice that you cannot omit the new operator from the elements initialization because there is no default initialization for the elements: int[][] jaggedArray3 = { new int[] {1,3,5,7,9}, new int[] {0,2,4,6}, new int[] {11,22} }; What does it mean? Why is it ok to omit new in: int[] arrSimp = { 1, 2, 3 }; int[,] arrMult = { { 1, 1 }, { 2, 2 }, { 3, 3 } }; but not possible in: int[][,] arrJagg = {new int[,] { { 1, 1} }, new int[,] { { 2, 2 } }, new int[,] { { 3, 3 } } };

2022-01-17 11:28:17    分类:问答    c#   new-operator   jagged-arrays

在考虑对齐要求时一般重载 operator new(Generically overloading operator new while considering alignment requirements)

问题 情况 我正在为动态内存(取消)分配编写内存管理器。 对于在调用operator new (或delete )时class A使用它, class A继承自class CustomAllocate就足够了,它本身以使用内存管理器的方式重载new和delete 。 问题 但是,显然我完全错过了对齐要求。 不幸的是, CustomAllocate::new没有关于继承自它的class A应该如何对齐的信息,因为唯一的参数是所请求内存的大小。 我正在寻找一种方法来包含对齐信息,而不必在每个class A中重载new (和delete )来使用内存管理器。 想法 1(以及为什么它不起作用) 使用表示对齐要求的整数值模板class CustomAllocate并像这样继承: class A : public CustomAllocate< alignof(A) > 。 不可能,因为alignof(A)在必须作为模板参数传递时不知道,即使传递的参数永远不应该改变class A的对齐要求。 想法 2(以及为什么它不起作用) 拥有一个纯虚函数virtual int CustomAllocate::getAlignment() = 0 ,通过复制粘贴类似return alignof(A);的方式在每个class A中实现。 . 不可能,因为new是静态的,因此永远无法访问虚函数。

2022-01-15 19:02:03    分类:技术分享    c++   alignment   operator-overloading   new-operator   generic-programming

C++ 重载 new[] 查询:它的参数大小是多少?(C++ overloaded new[] query : What size does it take as parameter?)

问题 我已经像这样重载了 operator new[] void * human::operator new[] (unsigned long int count){ cout << " calling new for array with size = " << count << endl ; void * temp = malloc(count) ; return temp ; } 现在打电话 human * h = new human[14] ; 说sizeof(human) = 16 ,但它打印的计数是 232 ,即 14*16 + sizeof( int * ) = 224+8 。 为什么要分配这个额外的空间? 它在记忆中的什么位置? 因为当我打印*h OR h[0]时,我得到相同的结果,所以它不在内存块的开头。 它完全正确还是我在这里遗漏了一些东西? 回答1 分配的额外空间用于存储数组的大小以供内部使用(实际上, delete[]知道要删除多少)。 它存储在内存范围的开头,紧接在&h之前。 要看到这一点,只需查看operator new[]中temp的值。 该值将不同于&h中的值。 回答2 它用于存储分配的对象数量,以便在调用delete[]时删除适当数量的对象。 有关更多详细信息,请参阅此常见问题解答。

2022-01-15 13:58:12    分类:技术分享    c++   overloading   new-operator

C++ overloaded new[] query : What size does it take as parameter?

I have overloadded operator new[] like this void * human::operator new[] (unsigned long int count){ cout << " calling new for array with size = " << count << endl ; void * temp = malloc(count) ; return temp ; } and now calling human * h = new human[14] ; say sizeof(human) = 16 , but count it prints is 232 which is 14*16 + sizeof( int * ) = 224+8 . Why is this extra space being allocated ? And where does it fall in memory ? Because when I print *h OR h[0] I get same results , so its not in beginning of memory chunk. Is it correct at all OR I am missing some thing here ?

2022-01-15 07:53:07    分类:问答    c++   overloading   new-operator

关于 C++ 中的新位置(Regarding placement new in C++)

问题 我对放置新操作符有疑问。 我有两个程序:Program1 (operator.cpp) 和 Program2 (main.cpp): 程序1:operator.cpp void *operator new(size_t size) { void *p; cout << "From normal new" << endl; p=malloc(size); return p; } void *operator new(size_t size, int *p) throw() { cout << "From placement new" << endl; return p; } 这是第一个链接到的第二个程序:main.cpp: #include <new> int main() { int *ptr=new int; int *ptr1=new(ptr) int(10); } 我正在单独编译 operator.cpp 和 main.cpp,如下所示: operator.cpp: g++ -g -c -o operator operator.cpp 然后将其与 main.cpp 链接: g++ -g -o target operator main.cpp. 令人惊讶的是,当我执行“./target”时,它正在打印:“From normal new”。 预期的输出是: 从正常新

2022-01-15 03:00:02    分类:技术分享    c++   new-operator   placement

为什么用 new Parent() 来初始化孩子的原型,而不是 Object.create(Parent.prototype)?(Why is new Parent() often used to initialize prototypes of children instead of Object.create(Parent.prototype)?)

问题 在 Mozilla 文档页面的中间,它切换(没有足够清晰的解释)示例 WorkerBee.prototype = Object.create(Employee.prototype); 到 WorkerBee.prototype = new Employee; 第二种形式new Employee将使用应该只存在于 WorkBee 实例中的属性来初始化 WorkBee 的原型。 为什么在如此多的 JavaScript 继承示例中使用第二种形式? 给继承的属性和自己的属性赋予不同的状态不是不希望的吗? WorkBee 中 Employee 属性名称的状态与属性项目不同,因为名称是在 WorkBee.prototype.name 中定义的,而项目是在 WorkBee 实例中定义的。 一般来说,为什么有人想使用非抽象类 X 的构造函数来初始化 JavaScript 中派生类 Y 的原型? 在我看来,这两个构造函数都应该只用于初始化 X 和 Y 的实例,如果 Y 是从 X 派生的,那么构造函数 X 应该初始化 Y 的实例,而不是 Y 的原型。但是如果 X 是抽象的,这意味着我们不期望有 X 的实例,只有这样我们才能潜在地使用 X 构造函数作为放置派生类原型初始化的地方。 回答1 为什么在这么多 JavaScript 继承示例中使用第二种形式? 因为我们没有摆脱它,它一直在蔓延。

2022-01-14 06:28:28    分类:技术分享    javascript   inheritance   prototype   instance   new-operator

在 Java 中,当一个对象实例化失败时会发生什么?(In Java what happens when an object fails to be instantiated?)

问题 我来自 c++ 背景,我发现自己经常在 java 中这样做: SomeClass sc=new SomeClass(); if(null!=sc) { sc.doSomething(); } 我想知道的是,如果构造函数由于某种原因(比如可能没有足够的内存)失败,变量 sc 中的内容是什么。 我找不到一个直接的答案,我担心我只是在浪费我的时间,因为如果新的操作员失败了,程序是否会崩溃? 回答1 Java Specification Language 3rd Edition彻底涵盖了您的问题: 12.5 新类实例的创建每当创建一个新的类实例时,都会为其分配内存空间,并为该类类型中声明的所有实例变量和该类类型的每个超类中声明的所有实例变量(包括所有可能隐藏的实例变量)分配空间。 如果没有足够的可用空间为对象分配内存,则类实例的创建会突然完成并出现 OutOfMemoryError。 否则,新对象中的所有实例变量,包括在超类中声明的变量,都将初始化为其默认值。 就在作为结果返回对新创建对象的引用之前,使用以下过程处理指示的构造函数以初始化新对象:[...] 因此, new表达式根本不可能返回null 。 无论返回什么,如果执行正常完成,将始终是实例化的任何类的有效instanceof 。 处理异常 一般来说,可能的异常通常使用try-catch块来处理: String

2022-01-13 13:08:42    分类:技术分享    java   object   new-operator   instantiation   creation