如果我传递一个指针函数作为参数会发生什么?

would anything happen if I pass a pointer function as a parameter?

我想知道如果我传递一个指针函数作为参数会发生什么,它是否有效并且是那个指针函数[=22的内存=] 卡在 RAM 中的某个地方?

这是例子:

char* Function1(char *array1, int N) {
    ...
    return newChar;
}
char* Function2(char *array2, int M) {
    ...
    return newChar;
}

char* newArray = Function2(Function1(oldArray, N), M);

delete[] oldArray;
delete[] newArray;

调用后Function1(oldArray, N)会不会有问题?

非常感谢。

一个 " 指针函数" 并不是真正的东西。我想你的意思是 函数指针.

是的,将函数指针作为参数传递给函数是完全可以的,但是您没有将函数指针作为参数传递这里。您传递函数返回的值,该函数 returns 是一个指针 - 也可以。

它返回一个指针并不重要。与此 pointer-free 示例进行比较:

#include <iostream>

int foo(int x) {
    return x + x;
}

int bar(int x) {
    return x * x;
}

int main() {
    std::cout << bar(foo(2)); // prints 16
}

您实际上并没有将 foo(2) 作为参数传递给 bar()。您将从 foo(2)(即 4)返回的内容传递给 bar()

编写此类函数调用是有效,但正如您所怀疑的那样,您在后续函数调用中为字符数组分配的内存将卡在 RAM 中, 内存泄漏。让我用下面的代码来解释一下。

char* Function1(char *array1, int N) {
    char *newarray = new char [N];
    for (int i = 0; i < N; ++i) 
        newarray[i] = array1[i] + 1;
    return newarray;
}

char* Function2(char *array2, int N) {
    char *newarray = new char [N];
    for (int i = 0; i < N; ++i) 
        newarray[i] = array2[i] + 1;
    return newarray;
}

这两个函数都分配一个新的space,存储给定字符数组的增量值和returns指向分配的space的指针。调用这两个函数,

int main()
{
    int N = 4;
    char *oldArray = "abcd";
    char *newArray = Function2(Function1(oldArray, N), N);
}

函数调用 Function1 没有任何错误,因为它 returns 指向新分配的 space 的指针并将其传递给 Function2 作为 array2.但是在 Function2 的末尾,指针 array2 将被删除,保留它所拥有的内存。这会导致 内存泄漏

为避免此泄漏,请删除 array2Function2 结束前保留的内存。

char* Function2(char *array2, int N) {
    ...
    delete[] array2;
    return newarray;
}

希望对您有所帮助!

虽然你的代码,从你展示的一点点来看,是完全有效的,但它也不是现代 C++ 中推荐的代码。

以下是此类代码的一些问题:

  1. 函数会释放您传递给它的指针吗?在那种情况下,您不能再次释放它。
  2. 该函数会将指针存储在以后可以访问的地方吗?在那种情况下,您无法在函数调用后释放指针。
  3. 函数是否需要指向单个字符、C 字符串或者甚至是指向文档中指定的某个大小的字符数组的指针?
  4. 函数是否返回指向静态缓冲区的指针?在那种情况下,您不能释放它。
  5. 函数是否返回指向单个字符的指针?那你就delete吧。还是它返回一个指向 char 数组的指针?那你就delete[]吧。或者它可能是 returns 由 malloc() 创建的指针。那你一定要free()了。

什么是int N?看起来很可疑,这可能是指针指向的数组的大小。但大小必须为 size_t,因为 int 不足以容纳较大数组的大小。

您应该花一些时间阅读 std::arraystd::vectorstd::spanstd::unique_ptr>std::shared_ptr 以及相关的 类 . https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines 也是一本好书。最好在真正需要它们之前忘记原始指针和 C 样式数组。