C++ 奇怪的真实行为

C++ 奇怪的真实行为,c++,c,memory,arrays,realloc,C++,C,Memory,Arrays,Realloc,我正在开发一个数组结构只是为了好玩。 此结构由模板参数概括,在启动时预先分配给定数量的项,然后,如果“忙”项多于可用项,则函数将重新分配内部缓冲区。 测试代码为: #include <stdio.h> #include <stdlib.h> #include <string.h> template <typename T> struct darray_t { size_t items; size_t busy; T

我正在开发一个数组结构只是为了好玩。 此结构由模板参数概括,在启动时预先分配给定数量的项,然后,如果“忙”项多于可用项,则函数将重新分配内部缓冲区。 测试代码为:

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

template <typename T> struct darray_t {
    size_t items;
    size_t busy;
    T     *data;
};

#define DARRAY_REALLOC_ITEMS_STEP 10

#define da_size(da) (da)->busy

template <typename T>
void da_init( darray_t<T> *da, size_t prealloc ){
    da->items = prealloc;
    da->busy  = 0;
    da->data  = (T *)malloc( sizeof(T) * prealloc );
}

template <typename T> T *da_next( darray_t<T> *da ){
    if( da->busy >= da->items ){
        da->data   = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );
        da->items += DARRAY_REALLOC_ITEMS_STEP;
    }
    return &da->data[ da->busy++ ];
}

int main(){
    darray_t<int> vi;
    int *n;

    da_init( &vi, 100 );

    for( int i = 0; i < 101; ++i ){
        n = da_next(&vi);
        *n = i;
    }

    for( int i = 0; i < da_size(&vi); ++i ){
        if( vi.data[i] != i ){
            printf( "!!! %d != %d\n", i, vi.data[i] );
        }
    }

    return 0;
}
#包括
#包括
#包括
模板结构darray\t{
大小项目;
大小不忙;
T*数据;
};
#定义DARRAY\u REALLOC\u项目\u步骤10
#定义数据大小(da)(da)->忙
模板
初始无效(darray,尺寸预先分配){
da->项目=预分配;
da->busy=0;
da->数据=(T*)malloc(大小(T)*预分配);
}
模板T*da\u下一步(darray\u T*da){
如果(da->忙>=da->项目){
da->data=(T*)realloc(da->data,sizeof(T)*DARRAY\u realloc\u ITEMS\u STEP);
da->items+=DARRAY\u REALLOC\u items\u步骤;
}
返回&da->data[da->busy++];
}
int main(){
darray_t vi;
int*n;
初始数据(&vi,100);
对于(int i=0;i<101;++i){
n=下一个日期(&vi);
*n=i;
}
对于(int i=0;i
如您所见,我在开始时预先分配了100个整数指针,然后一次再分配10个指针。 在main函数中,我执行for循环来检查项的完整性,如果数组项不是我期望的那样,我打印它的值并。。。你知道吗? 我有以下信息:

!!!11 != 135121

事实上,索引11的项目应该是'11',是135121!!!!:

你能告诉我我的代码是否不正确吗

谢谢

注意 我完全知道,这样混合C和C++是<强>丑陋< /强>,我也知道如果使用,这个结构会被拧紧,例如:

darray_t<std::string>
darray\t

这只是对int指针的测试。

块的大小不正确:

da->data   = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );
整个块与增量一样大。试一试

da->busy + sizeof(T) * DARRAY_REALLOC_ITEMS_STEP

realloc不会自动增加内存—您必须这样做。例如:

da->data=(T*)realloc(da->data, sizeof(T)*(da->items+DARRAY_REALLOC_ITEMS_STEP));

(您应该处理realloc返回NULL)

Ugh,C与模板,多么难看的混合。(如果我用
std::string
实例化模板,您认为会发生什么情况?)此结构不用于类,显然在这种情况下,我应该使用new操作符来alloc(调用类ctor),而我不能使用realloc。但是我重复一遍,这只是对int指针的测试。@sbi:C with templates是CUDA的一个习惯用法…但是
realloc
不是那么多。仅供参考,如果你增加一个常数因子,那么你的append函数平均得到O(n),而如果你将大小增加一倍,那么你的append函数就得到摊销O(1)。@Mike:是的,但他在评论中相当明确地表示,这“只是对int指针的测试”。