插件窝 干货文章 如何追踪C++和Python变量的内存地址及生命周期?

如何追踪C++和Python变量的内存地址及生命周期?

变量 周期 生命 地址 621    来源:    2025-03-15

在C++和Python中,追踪变量的内存地址和生命周期的方法有所不同,因为这两种语言的内存管理机制不同。下面分别介绍如何在C++和Python中追踪变量的内存地址和生命周期。

1. C++ 中的变量内存地址和生命周期追踪

1.1 内存地址追踪

在C++中,可以通过取地址运算符 & 来获取变量的内存地址。

#include <iostream>

int main() {
    int a = 10;
    std::cout << "Address of a: " << &a << std::endl;
    return 0;
}

1.2 生命周期追踪

C++中的变量生命周期取决于其作用域和存储类别:

  • 局部变量:在函数或块内定义的变量,生命周期从定义开始到块结束。
  • 全局变量:在函数外定义的变量,生命周期从程序开始到程序结束。
  • 静态变量:使用 static 关键字定义的变量,生命周期从第一次定义开始到程序结束。
  • 动态变量:使用 newdelete 手动管理的变量,生命周期从 new 开始到 delete 结束。
#include <iostream>

int global_var = 20; // 全局变量

void func() {
    static int static_var = 30; // 静态变量
    int local_var = 40; // 局部变量
    std::cout << "Address of local_var: " << &local_var << std::endl;
    std::cout << "Address of static_var: " << &static_var << std::endl;
}

int main() {
    std::cout << "Address of global_var: " << &global_var << std::endl;
    func();
    return 0;
}

2. Python 中的变量内存地址和生命周期追踪

2.1 内存地址追踪

在Python中,可以使用 id() 函数来获取对象的内存地址。

a = 10
print(f"Address of a: {id(a)}")

2.2 生命周期追踪

Python中的变量生命周期由垃圾回收机制管理,主要依赖于引用计数和垃圾回收器。

  • 引用计数:当一个对象的引用计数降为0时,对象会被立即回收。
  • 垃圾回收器:处理循环引用等复杂情况。

可以通过 sys.getrefcount() 查看对象的引用计数。

import sys

a = 10
print(f"Reference count of a: {sys.getrefcount(a)}")

b = a
print(f"Reference count of a after b = a: {sys.getrefcount(a)}")

3. 总结

  • C++:使用 & 获取变量地址,生命周期由作用域和存储类别决定。
  • Python:使用 id() 获取对象地址,生命周期由引用计数和垃圾回收机制管理。

通过上述方法,你可以在C++和Python中追踪变量的内存地址和生命周期。