【发布时间】:2020-06-02 17:35:00
【问题描述】:
这是我的代码 [注意我注释了 cstr 和析构函数]
#include <iostream>
#include <stdlib.h>
#include <array>
class MyIntClass
{
int _mymember;
public:
// MyIntClass(){}
// ~MyIntClass(){}
void *operator new(size_t size)
{
std::cout << "new: Allocating " << size << " bytes of memory" << std::endl;
void *p = malloc(size);
return p;
}
void operator delete(void *p)
{
std::cout << "delete: Memory is freed again " << std::endl;
free(p);
}
void *operator new[](size_t size)
{
std::cout << "new: Allocating " << size << " bytes of memory" << std::endl;
void *p = malloc(size);
return p;
}
void operator delete[](void *p)
{
std::cout << "delete: Memory is freed again " << std::endl;
free(p);
}
};
void line(){
std::cout << "\n--------------------------------------------------\n" << std::endl;
}
int main()
{
line();
std::cout << "Using new overloading and malloc\nWe will create one object of MyIntClass that is supposed to be 4 bytes" << std::endl;
MyIntClass *m1 = new MyIntClass();
line();
//I want to create an array of the MyIntClass of two objects
std::cout << "Now we create array of MyIntClass using <array> header" << std::endl;
std::array<MyIntClass, 2> z = {};
std::cout << " The elements in the array z = "<< z.size() <<std::endl;
std::cout << "The memory allocated for array z = " << sizeof(z) << std::endl;
line();
std::cout << "\nNow we create array using new[] overloading and malloc " << std::endl;
MyIntClass *i = new MyIntClass[2]();
delete[] i;
}
现在结果如下:
使用新的重载和 malloc
我们将创建一个 MyIntClass 对象,它应该是 4 个字节新:分配 4 个字节 记忆
现在我们使用
<array>header 创建 MyIntClass 数组
数组中的元素 z = 2
为数组 z = 8 分配的内存
现在我们使用 new[] 重载和 malloc 创建数组
新:分配 8 个字节的内存
对于没有经验的 C++ 程序员来说,我认为每件事都按预期工作
现在如果我取消注释构造函数,同样的结果会发生
但是,当我取消注释析构函数时,会出现不同的结果
现在我们使用 new[] 重载和 malloc 创建数组
新:分配 12 字节内存
所以我的问题是对此有何解释:
在使用array 库或重载new[] 和malloc 的两种方法中,创建两个对象的数组,每个对象都是4 字节,将导致为数组分配8 字节的内存。
然而,当我们有一个对象的析构函数时,malloc 将为这个 2 个元素的数组分配 12 个字节而不是 8 个字节。
我看到了这个question on SO,但它没有解释我的情况
以下是我的编译器版本:
gcc 版本 8.2.0 (MinGW.org GCC-8.2.0-3)
【问题讨论】:
-
删除所有这些多余的空行将使您的代码更具可读性 — 无需对实际代码进行任何更改!
-
什么是“memalloc”?
-
程序的行为是不确定的,因为你在一个不是由
new返回的指针上使用了delete(它是由new[]返回的)。 -
尝试打印出
sizeof(MyIntClass)用于您的各种类配置。 -
@Yksisarvinen 否。使用
delete[]以外的任何内容来释放分配有new[]的指针具有未定义的行为。不管是否有重载的运算符。
标签: c++ arrays memory-management