小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何在C++中動態(tài)分配二維數(shù)組

 oskycar 2011-12-02

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void **darray_new(int row, int col, int size)
{
void **arr;

arr = (void **) malloc(sizeof(void *) * row + size * row * col);
if (arr != NULL)
{
void *head;

head = (void *) arr + sizeof(void *) * row;
memset(arr, 0, sizeof(void *) * row + size * row * col);
while (row--)
arr[row] = head + size * row * col;
}
return arr;
}

void darray_free(void **arr)
{
if (arr != NULL)
free(arr);
}

嗯,連續(xù)分配內(nèi)存,而且可以用a[x][y]的方式來訪問!可謂二維數(shù)組動態(tài)分配的絕妙方法!這段程序是C的,似乎要改成支持對象分配的C++版也不是什么難事(不過估計得用上placement new吧,嗯,需要再思考一下……)。

2007-06-13 12:38 補充:

  經(jīng)過試驗,C++版出爐了:)關(guān)鍵點還是在于placement new和顯示的析構(gòu)函數(shù)調(diào)用,用于保證對象可以正常的構(gòu)造和析構(gòu)。
  這個實現(xiàn)也還是有不少缺點的,比如,數(shù)組的大小必須記住,才能保證析構(gòu)所有對象。不過這點可以通過改進分配方法算法,把數(shù)組大小也用一點空間保存起來。
  另一個缺點是,從語法上看,很容易讓人誤把darray_new返回的指針以為是數(shù)據(jù)區(qū)的起始地址,從而可能導(dǎo)致一些邏輯錯誤。

#include <iostream>
#include <cstdlib>
#include <new>

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);
}

2007-06-13 21:00補充
本文僅為技術(shù)層面的討論,實踐中考慮用
boost::multi_array之類的現(xiàn)成的解決方案可能會更有效。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多