Это моя функция под названием trim, которая разделяет строку своих котировок:
const char* trim(const char* c) {
const char *pos = c;
//Getting the length of the string
int c_length = 0;
while (*pos != '\0') {
c_length++;
pos++;
}
cout<<"\nThis is the length of string:"<<c_length;
char c_store[c_length-2]; // Removing two for the quotes
pos = c;
const char* quote = "\"";
char ch;
int i;
for (i = 0; *pos != '\0'; pos++){
ch = (char)*pos;
if(ch!=*quote) {
c_store[i] = (char)*pos;
i++;
}
}
c_store[i]='\0'; // Adding the null terminating character
const char * c_trimmed = c_store;
cout<<c_trimmed; // Prints the string CORRECTLY here !!
return c_trimmed; // There is problem when it returns, see main
}
Теперь я читаю из объекта json :: value, преобразуя значение в строку, используя toStyledString(), а затем преобразуя его в const char *, используя c_str(). Я считаю, что эта строка содержит кавычки вокруг него, поэтому я передаю это значение в обрезку функции. Когда значение возвращает возвращенную строку, она заканчивается двумя символами в конце. Это главная причина, по которой я думаю, что проблема кроется:
int main(int argc, char** argv) {
// Reading json config file into a Json::Value type
char* config_file = read_file_into_string(argv[1]);
Json::Value Bootloading_config = create_json_object(config_file);
const char* bucket_name_json = Bootloading_config["Bootloading"]["bucket_name"].toStyledString().c_str(); // Storing value from json
const char* bucket_name_trimmed = trim(bucket_name_json); // Using trim function
const char* bucket_name = "nikhil-hax"; // Assigning another pointer for comparison
printf("\n Trimmed bucket_name:%s", bucket_name_trimmed); // It is printing the string with the last two chars cut out
if(strcmp(bucket_name_trimmed,bucket_name) == 0) // To check
cout<<"\nTRIM function Worked!!";
else cout<<"\nNOT working, look closer";
}
Есть ли утечка памяти где-то или какая-то другая деталь, которую я пропускаю? Некоторая помощь будет высоко оценена. благодаря
Сначала вы объявляете локальную переменную:
char c_store[c_length-2]; // Removing two for the quotes
Затем вы копируете указатель на выделенную память (а не ее содержимое!):
const char * c_trimmed = c_store;
Теперь c_trimmed
указывает на то же пространство в памяти, что и c_store
. Затем вы печатаете его:
cout<<c_trimmed; // Prints the string CORRECTLY here !!
Затем вы возвращаете его из функции:
return c_trimmed;
И тогда память, на которую c_trimmed
и c_store
, автоматически освобождается:
}
После возвращения из функции его результат больше не указывает на допустимое место в памяти. Если вы хотите вернуть строку c-style из функции, вы должны выделить для нее память. Что-то вроде:
char * c_trimmed = new char[c_length-2];
strcpy(c_trimmed, c_store);
return c_trimmed;
// Don't forget to delete[] the result of this function when it is no longer needed
// or else you'll end up with memory leak
Нижняя заметка. Если вы действительно пишете в C++, а не в C, используйте std::string
вместо этого - у вас будет половина проблем, которые у вас есть сейчас (и будут иметь в будущем).