c++ 函数返回指针的问题

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)

这只是一段非常简单的代码。问题在于第一个函数调用的结果被第二个函数调用覆盖。如何修复它?

eer*_*ika 6

int *ip1Array = new int[4]; 
Run Code Online (Sandbox Code Playgroud)

这定义了一个指针。您已将其初始化为指向动态数组。

ip1Array = ipSplit(4);
Run Code Online (Sandbox Code Playgroud)

此赋值会覆盖先前的指针值。由于先前的值是指向动态数组的唯一指针,因此不再有任何东西指向它,并且无法再删除它。这称为内存泄漏。不要这样做。


static int ipTab[4];
Run Code Online (Sandbox Code Playgroud)

static意味着该变量在函数的所有调用中都是相同的。每次调用该函数都会返回一个指向同一数组(的第一个元素)的指针。

ip1Array = ipSplit(4);
ip2Array = ipSplit(2);
Run Code Online (Sandbox Code Playgroud)

这两个数组都指向函数返回的同一数组(的第一个元素)。两个动态数组都已泄漏。


ip1Array = ipSplit(4);
Run Code Online (Sandbox Code Playgroud)

您使用参数 4 调用该函数。

static int ipTab[4];
Run Code Online (Sandbox Code Playgroud)

该数组有 4 个元素。

for (int i = 0; i <= ip; i++) {
Run Code Online (Sandbox Code Playgroud)

您可以通过索引 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)