Como retornar um array de char criado na função?

Eu tenho programado mal por um bom tempo e só realmente percebi. Eu já criei muitas funções que retornam seqüências de caracteres como matrizes de caracteres (ou pelo menos ponteiros para elas).

Outro dia, alguém apontou que, quando minhas funções retornam, as matrizes de caracteres apontadas por minhas funções ficaram fora do escopo e agora estou essencialmente apontando para um pouco de memória aleatória (um ponteiro desagradável).

Eu realmente não percebi isso por um tempo porque as matrizes de caracteres quando enviadas para o console não pareciam estar corrompidas (provavelmente porque não havia tempo para que esses dados fossem substituídos). No entanto, notei isso quando estava retornando um buffer de seqüência de caracteres (matriz de caracteres) gerado pela leitura da porta serial que estava frequentemente corrompida.

Então, qual a melhor forma de fazê-lo?

Meu código incorreto é o seguinte:

#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;
}

Entendo que talvez eu deva alocar memória no programa antes de chamar a função ou criar uma variável global para inserir a string retornada, mas se minha função chamada for usada por muitos programas diferentes, como saber o tamanho do buffer que está sendo passado antes e quando essa memória deve ser excluída?

O código a seguir também não faz o que eu quero corretamente:

#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;
}

Eu quero preencher a matriz que o ponteiro analisado aponta para, mas isso não acontece no código acima.

Além disso, quando devo usar o novo comando [] para criar minha matriz? é necessário? e quando devo chamar delete [] nele.

Muito obrigado por isso, é obviamente muito fundamental, mas algo que venho fazendo de errado há algum tempo.

questionAnswers(4)

yourAnswerToTheQuestion