最近遇到了一个用placement new动态创建二维数组的问题,分享一下

来源:互联网 发布:mysql 并发 version 编辑:程序博客网 时间:2024/05/16 15:21

老大说,叫我研究一下动态分配二维数组,教我研究一下,不多说,直接上代码



#include "stdafx.h"


#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <new>
class A{
public:
void printA(int i){
printf("我是%d\n\n",i);
}
};
template <typename T>
T **darray_new(int row, int col)
{
int size = sizeof(T);
void **arr = (void **)malloc(sizeof(void *) * row + size * row * col);
if (arr != NULL)
{
unsigned char * head;
head = (unsigned char *)arr + sizeof(void *) * row;
for (int i = 0; i < row; ++i)
{
arr[i] = head + size * i * col;
for (int j = 0; j < col; ++j)
new (head + size * (i * col + j)) T;
}
}
return (T**)arr;
}


template <typename T>
void darray_free(T **arr, int row, int col)
{
for (int i = 0; i < row; ++i)
for (int j = 0; j < col; ++j)
arr[i][j].~T();
if (arr != NULL)
free((void **)arr);
}
int main(){
A **a = darray_new<A>(4, 3);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
a[i][j].printA(i * 3 + j);
darray_free(a, 4, 3);
return 0;
}

网上找到的一位大神的文章,还有包括C的http://www.360doc.com/content/11/1202/10/2036337_169077281.shtml