Я давно плохо программирую, и я действительно только что понял. Ранее я создал много функций, которые возвращают символьные строки в виде массивов символов (или, по крайней мере, указателей на них).
На днях кто-то указал, что когда мои функции возвращают массивы символов, на которые указывают мои функции, они вышли из области видимости, и теперь я, по сути, указываю на случайный бит памяти (неприятный висящий указатель).
Некоторое время я не замечал этого, потому что массивы символов при выводе на консоль не выглядели поврежденными (возможно, потому, что не было времени перезаписать эти данные). Однако я заметил это, когда возвращал строковый буфер (массив символов), сгенерированный чтением последовательного порта, который часто был поврежден.
Итак, как лучше мне это сделать?
Мой плохой код выглядит следующим образом:
#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;
}
Я хочу заполнить массив, на который указывает проанализированный указатель, но в коде выше этого не происходит.
Кроме того, когда мне следует использовать команду new [] для создания массива? это нужно? и когда я должен вызвать delete [] на нем.
Большое спасибо за это, это, очевидно, очень фундаментально, но что-то, что я делал некоторое время неправильно.