cat
是不是被返回给此函数的调用者。当您执行cat = longcat
时,您只更改本地副本。
这意味着您传递给此函数的参数仍然指向您非常不方便删除的旧地址。
要么通过它作为参考或做旧C双指针技巧,并通过其地址。
您可能还需要确保你第一次调用该方法,cat
有一个有效值和size
和looong
兼容(looong * 2 >= size
)免得破坏内存。
看一看下面的代码说明您的问题:
#include <iostream>
void longcatislong1(int* cat, int &size, int &looong)
{
int* longcat = new int[looong*2];
for(int i = 0; i < size; i = i + 1)
longcat[i] = cat[i];
delete [] cat;
cat = longcat;
looong = looong * 2;
}
void longcatislong2(int*& cat, int &size, int &looong)
{
int* longcat = new int[looong*2];
for(int i = 0; i < size; i = i + 1)
longcat[i] = cat[i];
delete [] cat;
cat = longcat;
looong = looong * 2;
}
int main (void) {
int sz = 0;
int lng = 10;
int *ct = 0;
std::cout << ct << std::endl;
longcatislong1 (ct, sz, lng);
std::cout << ct << std::endl;
longcatislong2 (ct, sz, lng);
std::cout << ct << std::endl;
return 0;
}
它的输出是:
0
0
0x9c83060
这意味着longcatislong1
呼叫没有成功设置ct
上的回报。 longcatislong2
功能,它将指针作为参考,确实设置ct
正确。
假设您有一个指向0xf0000000
的有效指针。当您调用原始函数时,会分配一个新的内存块,数据将被复制并删除旧的块。
但ct
变量仍然指向旧块。
该下一个当你调用该函数,或者即使你在其他地方解除ct
,你在一个痛苦的世界,通常被称为未定义的行为。
通过将第一个参数引用类型,在功能上作出变化反映早在中传递变量。
-1请保持4chan的上4chan的。 (如果你要尝试,至少不要成为新的......) – GManNickG 2011-01-20 06:28:21
难道你不知道规则1和2吗? – 2011-01-20 07:07:25
这基本上是使用C++的规则 - 每一行都是压路机。 – ActiveTrayPrntrTagDataStrDrvr 2012-06-21 15:06:09