Я надеюсь, что кто-нибудь может помочь ответить на вопрос о строках в C ++. Я попытался удалить любой посторонний код отсюда, чтобы он не компилировался (отсутствует пространство имен, определения и т. Д.). Это не проблема "ошибки". Если вам нужны рабочие примеры кода, пожалуйста, укажите, какой код вы хотите (для какого вопроса), я был бы рад изложить что-то более подробное.
//Foo.c
#define EXIT "exit"
Bar* bar; //See question C
//1
foo(const string& text) {
cout << text;
bar = new Bar(text); //See question C
}
//2
foo(const char* text) {
cout << text;
}
//3
foo(string text) {
cout << text;
}
int main() {
....
{ foo(EXIT); } //braces for scope, see question C)
bar->print(); //4
....
}
class Bar {
private const string& strBar;
Bar::Bar(const string& txt) : strBar(txt) { }
Bar::print() { cout << strBar; }
}
Если предположить, что только один из трех методов foo () не закомментирован, они не должны быть перегружены. У меня есть пара вопросов здесь:
A) Если бы я мог понять, как использовать OllyDbg достаточно хорошо, чтобы возиться со строковым литералом «exit» в «axit» ПОСЛЕ вызова foo (), я считаю, что вывод все равно будет «exit» в случае 1 и 3, и «выход» в случае 2. Это правильно?
B) В случаях 1 и 3 я полагаю, что, поскольку метод запрашивает строку (даже если это ссылка в случае 1), существует неявный вызов строкового конструктора (он принимает const char *) и этот конструктор ВСЕГДА делает копию, а не ссылку. (см. строковая страница cplusplus.com ). Это правильно (особенно ВСЕГДА)?
C) В случае 1, если я инициализировал новый класс со строкой и атрибутом, которому я назначил текстовую переменную, будет ли эта ссылка указывать на плохую память, когда мы покидаем область? То есть, когда мы достигаем 4, я думаю, что произошло следующее (предполагая, что foo (const string & text) является функцией без комментариев)
1. Временный строковый объект создается для строки foo (EXIT), которая копирует литерал.
2. Ссылка на временный объект передается через bar и атрибуту strBar.
3. Как только код движется дальше и покидает область, в которой был вызван foo (EXIT), я считаю, что объект временной строки выходит из области видимости и исчезает, что означает, что теперь strBar ссылается на область памяти с неопределенным содержимым, думая, что это так. все еще строка.
D) Возвращаясь к A, я верю в случае 2 (foo (const char * text)), что этот вызов foo ссылается на сам литерал, а не на копию, поэтому перебирание литерала в памяти изменит выход. Это правильно? Могу ли я продолжать передавать литерал через (скажем, в Bar), если я продолжаю использовать const char *?
E) Как бы вы протестировали что-либо из этого, помимо "вот как это работает"? и "читать спецификации"? Мне не нужны пошаговые инструкции, но некоторые идеи о том, что я должен был сделать, чтобы самостоятельно ответить на вопрос, используя имеющиеся у меня инструменты (Visual Studio, OllyDbg, предложения для других?), Были бы хорошими. Я потратил немало времени, пытаясь это сделать, и я хотел бы услышать, что люди говорят.