我想知道如果我將指標函式作為引數傳遞會發生什么,它是否有效并且該指標函式的記憶體是否卡在 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)被呼叫后會有什么問題呢?
非常感謝你。
uj5u.com熱心網友回復:
撰寫此類函式呼叫是有效的,但正如您所懷疑的,您在后續函式呼叫中為字符陣列分配的記憶體將卡在 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;
}
這兩個函式都分配一個新空間,存盤給定字符陣列的增量值,并回傳指向分配空間的指標。呼叫這兩個函式,
int main()
{
int N = 4;
char *oldArray = "abcd";
char *newArray = Function2(Function1(oldArray, N), N);
}
函式呼叫沒有任何問題,Function1因為它回傳指向新分配空間的指標并將其傳遞給Function2as array2。但在 結束時Function2,指標array2將被洗掉,保留它所持有的記憶體。這會導致記憶體泄漏。
為避免這種泄漏,請array2在Function2.
char* Function2(char *array2, int N) {
...
delete[] array2;
return newarray;
}
希望能幫助到你!
uj5u.com熱心網友回復:
“指標函式”并不是一個真正的東西。我想你的意思是函式指標。
是的,將函式指標作為引數傳遞給函式是完全可以的,但您沒有在此處將函式指標作為引數傳遞。您傳遞回傳指標的函式回傳的值 - 這也可以。
它回傳一個指標并不重要。與這個無指標示例進行比較:
#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().
uj5u.com熱心網友回復:
雖然您的代碼(從您所展示的少量代碼來看)是完全有效的,但它也不是現代 C 中推薦的代碼。
以下是此類代碼的一些問題:
- 該函式會釋放您傳遞給它的指標嗎?在這種情況下,您不能再次釋放它。
- 該函式會將指標存盤在以后可以訪問的地方嗎?在這種情況下,您無法在函式呼叫后釋放指標。
- 該函式是否需要指向單個字符、C 字串或什至可能是指向檔案中指定的某種大小的字符陣列的指標?
- 該函式是否回傳指向靜態緩沖區的指標?在這種情況下,您不能釋放它。
- 該函式是否回傳指向單個字符的指標?然后你必須這樣
delete做。還是回傳一個指向 char 陣列的指標?然后你必須這樣delete[]做。或者它可能回傳一個由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 樣式陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480171.html
上一篇:應該回傳結構指標的函式
下一篇:使用指標呼叫函式并在引數中傳遞它
