设计一个程序,程序使用new和delete申请动态对象,sizeof求出对象的内存大小和类的内存大小
时间: 2024-06-05 22:06:58 浏览: 6
#include<iostream>
using namespace std;
class A{
public:
int a;
char b;
double c;
void func(){}
};
int main(){
A* p = new A;
cout<<"对象的内存大小为:"<<sizeof(*p)<<endl;
delete p;
A obj;
cout<<"类的内存大小为:"<<sizeof(obj)<<endl;
return 0;
}
相关问题
一个动态申请内存大小的byte数组
在C语言中,可以使用`malloc`函数动态申请内存,来创建一个动态大小的byte数组。具体实现如下:
```c
unsigned char *byteArray;
int size = 10; // 申请10字节大小的数组
byteArray = (unsigned char*) malloc(size * sizeof(unsigned char));
```
上述代码中,首先声明了一个指向`unsigned char`类型的指针`byteArray`,然后使用`malloc`函数申请一段内存,并将指针指向这段内存。`malloc`函数的参数是所需内存的字节数,这里是`size * sizeof(unsigned char)`。需要注意的是,`malloc`返回的是指向内存块起始地址的指针,因此需要将它转换为`unsigned char`类型的指针。
申请内存后,可以像访问静态数组一样访问动态数组中的元素,例如:
```c
byteArray[0] = 0x12; // 将第一个元素赋值为0x12
unsigned char value = byteArray[1]; // 读取第二个元素的值
```
在使用完动态数组后,需要使用`free`函数释放内存,例如:
```c
free(byteArray);
```
这样可以将动态申请的内存归还给操作系统,避免内存泄漏。
使用C++11封装一个对象内存池类
好的,我来回答你的问题。
要使用C++11封装一个对象内存池类,我们可以采用以下步骤:
1. 定义一个泛型类,用于存储对象内存池的数据结构。
```c++
template <typename T>
class ObjectPool {
// ...
};
```
2. 在类中定义一个std::vector,用于存储对象内存池中的对象。
```c++
template <typename T>
class ObjectPool {
public:
ObjectPool() noexcept = default;
~ObjectPool() noexcept {
for (auto it = m_pool.begin(); it != m_pool.end(); ++it) {
::operator delete(*it);
}
}
private:
std::vector<void*> m_pool;
};
```
3. 定义一个函数用于从内存池中分配对象。
```c++
template <typename T>
class ObjectPool {
public:
T* Allocate() {
if (m_pool.empty()) {
return static_cast<T*>(::operator new(sizeof(T)));
}
void* ptr = m_pool.back();
m_pool.pop_back();
return static_cast<T*>(ptr);
}
private:
// ...
};
```
4. 定义一个函数用于将对象返回到内存池中。
```c++
template <typename T>
class ObjectPool {
public:
void Deallocate(T* ptr) noexcept {
m_pool.push_back(ptr);
}
private:
// ...
};
```
5. 在类中添加一些辅助函数,例如获取内存池中对象的数量等等。
```c++
template <typename T>
class ObjectPool {
public:
bool Empty() const noexcept {
return m_pool.empty();
}
size_t Size() const noexcept {
return m_pool.size();
}
private:
// ...
};
```
完整的代码如下所示:
```c++
#include <vector>
template <typename T>
class ObjectPool {
public:
ObjectPool() noexcept = default;
~ObjectPool() noexcept {
for (auto it = m_pool.begin(); it != m_pool.end(); ++it) {
::operator delete(*it);
}
}
T* Allocate() {
if (m_pool.empty()) {
return static_cast<T*>(::operator new(sizeof(T)));
}
void* ptr = m_pool.back();
m_pool.pop_back();
return static_cast<T*>(ptr);
}
void Deallocate(T* ptr) noexcept {
m_pool.push_back(ptr);
}
bool Empty() const noexcept {
return m_pool.empty();
}
size_t Size() const noexcept {
return m_pool.size();
}
private:
std::vector<void*> m_pool;
};
```
希望这个回答能够帮助到你。
相关推荐
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)