我在这个函数中返回一个指向内存块的void *指针:
memory.cpp:
int mem[1000];
int* pointers[100];
int start_index = 100;
void* allocate(int size) {
pointers[0] = &mem[start_index];
return (void *) pointers[0];
}
main.cpp中:
int* arr = (int*) allocate(50); // allocate array of size 50 starting at mem[100]
arr[0] = 62; // changes mem[100] to 62
现在说我想让这个函数的用户使用mem数组的不同位置,而不会通知分配函数的用户(假设我们丢失数据没问题)。
我不能这样做吗?
memory.cpp:
pointers[0] = &mem[200];
在memory.cpp中执行此行后,我希望arr[0]
指向mem[200]
。
如果不改变分配函数的原型就可以吗?
由于
答案 0 :(得分:1)
是的,您可以随时更改指向其他内容的指针。
但是,这只会更改您指定的指针,而不会更改使用旧指针的其他位置。因此,如果某些代码保存了allocate
函数中返回的值,并且您稍后将pointers[0]
更改为指向其他内容,则旧保存的指针不会更改。
答案 1 :(得分:1)
不,你不能。您需要返回一个指向指针(void**
),并使allocate
函数的客户端绝对清楚它们不允许它们为内存创建别名。无论如何,这是一个非常坏主意,你会遇到左右问题(例如,如果你的客户使用就地new
来分配非POD对象,那该怎么办?记忆?)