查宁在C++返回后返回了指针

Chaning returned pointer after it's been returned in C++

本文关键字:返回 指针 C++      更新时间:2023-10-16

我在这个函数中返回一个指向内存块的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]。这可能不改变分配函数的原型吗?

谢谢

不行。您需要返回一个指向指针的指针(void**),并让allocate函数的客户机绝对清楚地知道,它们不允许创建内存的别名。无论如何,这是一个非常坏主意,你会遇到的问题左和右(例如,如果你的客户端使用就地new分配一个非pod对象在内存中?)

是的,你可以随时改变指针指向别的东西。

然而,这只会改变你所赋值的指针,而不会改变其他使用旧指针的地方。因此,如果某些代码保存了allocate函数的返回值,而您稍后将pointers[0]更改为指向其他内容,则旧的保存指针将不会更改。