Я плохо программировал какое-то время, и я только что понял. Я ранее создал много функций, которые возвращают символьные строки как char массивы (или, по крайней мере, указатели на них).
На днях кто-то указал, что когда мои функции возвращают массивы char, на которые указывают мои функции, вышли из области видимости, и я по существу теперь указываю на случайный бит памяти (неприятный висячий указатель).
Я не замечал этого какое-то время, потому что массивы char при выводе на консоль не выглядели поврежденными (вероятно, потому, что не было времени для перезаписывания этих данных). Однако я заметил это, когда возвращал строковый буфер (массив char), созданный при чтении последовательного порта, который был часто поврежден.
Итак, как лучше мне это сделать?
Мой плохой код выглядит следующим образом:
#include <cstdlib>
#include <iostream>
using namespace std;
char* myBadFunction(){
char charArray[] = "Some string\n";
char* charPointer = charArray;
return charPointer;
}
int main(int argc, char** argv) {
cout << myBadFunction();
return 0;
}
Я понимаю, что я должен, возможно, выделить память в программе перед вызовом функции или создать глобальную переменную, чтобы поместить возвращаемую строку, но если моя вызываемая функция используется многими различными программами, когда она должна знать размер буфер передается в него заранее и когда эта память должна быть удалена?
Следующий код также не делает то, что я хочу, чтобы он правильно:
#include <cstdlib>
#include <iostream>
using namespace std;
void fillArray(char* charPointer){
char charArray[] = "Some string\n"; // Create string
charPointer = charArray; // Not correct, want to fill predefined array with created string
return;
}
int main(int argc, char** argv) {
char predefinedArray[50] = {0};
fillArray(predefinedArray);
cout << predefinedArray;
return 0;
}
Я хочу заполнить массив, на который указывает обработчик, но это не происходит в коде выше.
Также, когда я должен использовать новую команду [] для создания моего массива? это необходимо? и когда я должен называть delete [] на нем.
Большое спасибо за это, его, очевидно, очень фундаментальное, но кое-что я делал неправильно какое-то время.