Вы задали очень интересный вопрос, который требует чуть более детального разъяснения особенностей C++.

Возьмём простую программу ради примера.

```cpp
#include <iostream>

using std::cout;
using std::endl;

int main(){
    int a = 1;
    int *b = new int(2);
    static int c = 3;
    
    cout << a << ' ' << *b << ' ' << c << endl;

    delete b;    
    return 0;
}
```

В данном случае происходит следующее:  

* Переменная `a` находится на стеке. Она ииницилизируется после входа в функцию, и уничтожается незадолго до выхода из неё. "Уничтожалась" означает, что будь у неё десктруктор, он был бы вызван.

* Переменная `b` тоже находится на стеке. Но. Переменная `b` у нас хранит не целое число, а указатель на него. Адрес целого числа. Вызов `new()` *создаёт объект в куче и возвращает его адрес*, то есть указатель. То есть объект у нас хранится в куче, а вот адрес его является значением, и хранится на стеке.

* Переменная `c` статична. И в данном случае она совсем необязательно храниться на стеке, и может висеть, например, в сегменте данных. Где конкретно она окажется, зависит от реализации компилятора.  

Ситуация осложняется ещё и тем, что программист может переопределить оператор `new`, и выделять память не в куче, а где-то ещё. В данном случае этого не происходит.

То есть ситуация следующая. Объект - это блок памяти. Он может находиться в разных местах. Если он был объявлен как обычная переменная, то обычно он окажется на стеке, кроме случаев, когда он статичный. Адрес объекта является таким же значением, как, например, и целое число. Но когда вызывается `new()` она инициализирует требуемый блок памяти на куче, и возвращает его адрес.

Надеюсь, такое объяснение понятно, или же нужно объяснить какие-то детали в больших подробностях?
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence