如果我传递一个指针函数作为参数会发生什么?
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
将被删除,保留它所拥有的内存。这会导致 内存泄漏 。
为避免此泄漏,请删除 array2
在 Function2
结束前保留的内存。
char* Function2(char *array2, int N) {
...
delete[] array2;
return newarray;
}
希望对您有所帮助!
虽然你的代码,从你展示的一点点来看,是完全有效的,但它也不是现代 C++ 中推荐的代码。
以下是此类代码的一些问题:
- 函数会释放您传递给它的指针吗?在那种情况下,您不能再次释放它。
- 该函数会将指针存储在以后可以访问的地方吗?在那种情况下,您无法在函数调用后释放指针。
- 函数是否需要指向单个字符、C 字符串或者甚至是指向文档中指定的某个大小的字符数组的指针?
- 函数是否返回指向静态缓冲区的指针?在那种情况下,您不能释放它。
- 函数是否返回指向单个字符的指针?那你就
delete
吧。还是它返回一个指向 char 数组的指针?那你就delete[]
吧。或者它可能是 returns 由 malloc()
创建的指针。那你一定要free()
了。
什么是int N
?看起来很可疑,这可能是指针指向的数组的大小。但大小必须为 size_t
,因为 int
不足以容纳较大数组的大小。
您应该花一些时间阅读 std::array
、std::vector
、std::span
、std::unique_ptr>
和 std::shared_ptr
以及相关的 类 . https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines 也是一本好书。最好在真正需要它们之前忘记原始指针和 C 样式数组。
我想知道如果我传递一个指针函数作为参数会发生什么,它是否有效并且是那个指针函数[=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
将被删除,保留它所拥有的内存。这会导致 内存泄漏 。
为避免此泄漏,请删除 array2
在 Function2
结束前保留的内存。
char* Function2(char *array2, int N) {
...
delete[] array2;
return newarray;
}
希望对您有所帮助!
虽然你的代码,从你展示的一点点来看,是完全有效的,但它也不是现代 C++ 中推荐的代码。
以下是此类代码的一些问题:
- 函数会释放您传递给它的指针吗?在那种情况下,您不能再次释放它。
- 该函数会将指针存储在以后可以访问的地方吗?在那种情况下,您无法在函数调用后释放指针。
- 函数是否需要指向单个字符、C 字符串或者甚至是指向文档中指定的某个大小的字符数组的指针?
- 函数是否返回指向静态缓冲区的指针?在那种情况下,您不能释放它。
- 函数是否返回指向单个字符的指针?那你就
delete
吧。还是它返回一个指向 char 数组的指针?那你就delete[]
吧。或者它可能是 returns 由malloc()
创建的指针。那你一定要free()
了。
什么是int N
?看起来很可疑,这可能是指针指向的数组的大小。但大小必须为 size_t
,因为 int
不足以容纳较大数组的大小。
您应该花一些时间阅读 std::array
、std::vector
、std::span
、std::unique_ptr>
和 std::shared_ptr
以及相关的 类 . https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines 也是一本好书。最好在真正需要它们之前忘记原始指针和 C 样式数组。