Являются ли строковые литералы, которые мы используем внутри функций автоматическими переменными? Или они размещены в куче, которую мы должны освободить вручную?
У меня есть ситуация, подобная приведенному ниже коду, в которой я присваиваю строковый литерал частному полю класса (помечен как ОДИН в коде) и получаю его намного позже в моей программе и использую его (помеченный как ДВА). Присваиваю ли я переменную в стеке полю в ОДНОМ? Может ли код ссылаться на висячий указатель, который в этом случае работал, потому что программа была достаточно маленькой?
Я скомпилировал и запустил его, он работал нормально, но у меня возникла странная ошибка в моей реальной программе, когда я назначал строковые литералы для полей класса, как это, и я подозреваю, что случай, который я упоминал выше. 1005 *
#include <iostream>
using namespace std;
class MemoryLeak
{
private:
char *s;
public:
MemoryLeak() {}
void store()
{
s = "Storing a string"; // ONE
}
char *retrieve()
{
return s;
}
};
int main()
{
MemoryLeak *obj = new MemoryLeak();
obj->store();
cout << obj->retrieve() << endl; // TWO
delete obj;
return 0;
}
Должен ли я объявлять переменную "s" как массив символов вместо указателя? Я планирую использовать std :: string, но мне просто интересно это.
Любые указатели или помощь, как всегда, высоко ценится :) Спасибо.