1 c++ arrays pointers function
当我想读取结果时,我调用一个返回指针两次的函数,第一个被第二个覆盖
int *ip1Array = new int[4];
int *ip2Array = new int[4];
ip1Array = ipSplit(4);
ip2Array = ipSplit(2);
int *ipSplit(int ip)
{
static int ipTab[4];
for (int i = 0; i <= ip; i++) {
ipTab[i] = ip
}
return ipTab;
}
Run Code Online (Sandbox Code Playgroud)
这只是一段非常简单的代码。问题在于第一个函数调用的结果被第二个函数调用覆盖。如何修复它?
Run Code Online (Sandbox Code Playgroud)int *ip1Array = new int[4];
这定义了一个指针。您已将其初始化为指向动态数组。
Run Code Online (Sandbox Code Playgroud)ip1Array = ipSplit(4);
此赋值会覆盖先前的指针值。由于先前的值是指向动态数组的唯一指针,因此不再有任何东西指向它,并且无法再删除它。这称为内存泄漏。不要这样做。
Run Code Online (Sandbox Code Playgroud)static int ipTab[4];
static意味着该变量在函数的所有调用中都是相同的。每次调用该函数都会返回一个指向同一数组(的第一个元素)的指针。
Run Code Online (Sandbox Code Playgroud)ip1Array = ipSplit(4); ip2Array = ipSplit(2);
这两个数组都指向函数返回的同一数组(的第一个元素)。两个动态数组都已泄漏。
Run Code Online (Sandbox Code Playgroud)ip1Array = ipSplit(4);
您使用参数 4 调用该函数。
Run Code Online (Sandbox Code Playgroud)static int ipTab[4];
该数组有 4 个元素。
Run Code Online (Sandbox Code Playgroud)for (int i = 0; i <= ip; i++) {
您可以通过索引 0、1、2、3、4 进行访问。数一下他们。您可以访问 5 个不同的索引。您访问数组的边界之外,并且程序的行为是未定义的。不要这样做。
如何修复它?
static.由于数组的大小是恒定的并且很小,因此您可以使用std::array:
auto
ipSplit(int ip)
{
assert(ip <= 4);
std::array<int, 5> ipTab{};
for (int i = 0; i <= ip; i++) {
ipTab[i] = ip
}
return ipTab;
}
// usage
auto ip1Array = ipSplit(4);
auto ip2Array = ipSplit(2);
Run Code Online (Sandbox Code Playgroud)