Зависит от того, где находится эта линия.Если он находится где-то в области видимости файла (то есть вне функции), то 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