gpt4 book ai didi

c++ - 奇怪的重新分配行为

转载 作者:搜寻专家 更新时间:2023-10-31 01:22:22 26 4
gpt4 key购买 nike

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

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

如您所见,我在开始时预分配了 100 个整数指针,然后我每次用另外 10 个指针重新分配它们。在主函数中,我执行一个 for 循环来检查项的完整性,如果数组项不符合我的预期,我将打印它的值,然后……你知道吗?我有以下消息:

!!! 11 != 135121

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

如果我的代码不正确,你能告诉我吗?

谢谢

注意我完全知道以这种方式混合 C 和 C++ 是丑陋的,而且我也知道如果使用这种结构会搞砸,例如:

darray_t<std::string>

这只是对 int 指针的测试。

最佳答案

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

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

(你应该处理 realloc 返回 NULL)

关于c++ - 奇怪的重新分配行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2912037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com