Это зависит от того, где находится эта линия. Если он находится где-то в области файла (т. Е. Вне функции), то x
- это глобальная переменная, которая определенно равна , а не в стеке (ну, теоретически это можно было бы положить в стек перед вызовом main()
, но я сильно сомневаюсь, что любой компилятор делает это), но также не в куче. Если, однако, строка является частью функции, то действительно x
находится в стеке.
С x
имеет тип string*
(то есть указатель на строку), он действительно содержит только адрес строкового объекта, выделенного new
.Поскольку этот строковый объект выделен new
, он действительно живет в куче.
Обратите внимание, что, в отличие от Java, нет необходимости, чтобы встроенные типы находились в стеке и объекты класса, находящиеся в куче. Ниже приведен пример указателя, живущего на куче, указывающего на объект, живущий в штабеле:
int main()
{
std::string str("Hello"); // a string object on the stack
std::string** ptr = new std::string*(&str); // a pointer to string living on the heap, pointing to str
(**ptr) += " world"; // this adds "world" to the string on the stack
delete ptr; // get rid of the pointer on the heap
std::cout << str << std::endl; // prints "Hello world"
} // the compiler automatically destroys str here
Зависит. Является ли 'x' локальной переменной? –
Да, это локально. Я должен был упомянуть об этом. Будем добавлять его, спасибо. – id2341677
Возможно, [этот мой ответ] (http://stackoverflow.com/a/7462893/596781) представляет интерес, или [этот] (http://stackoverflow.com/a/7581238/596781), или [this one] (http://stackoverflow.com/a/8439947/596781), или [этот] (http://stackoverflow.com/a/6816851/596781), или [этот] (http://stackoverflow.com/a/7620541/596781). –