開始與代碼:C++是堆棧還是堆分配?
#include <iostream>
#include <string>
#include <map>
#include <boost/asio.hpp>
typedef std::map<boost::asio::ip::address, int> Ip2Int;
Ip2Int ip2int;
void
func1()
{
boost::asio::ip::address addr4 = boost::asio::ip::address::from_string("192.168.2.1");
boost::asio::ip::address addr6 = boost::asio::ip::address::from_string("de::ad");
ip2int.insert(std::pair<boost::asio::ip::address, int>(addr4, 1));
ip2int.insert(std::pair<boost::asio::ip::address, int>(addr6, 2));
}
int
main()
{
func1();
Ip2Int::iterator iter = ip2int.begin();
do {
std::cout << iter->first << " -> " << iter->second << std::endl;
} while (++iter != ip2int.end());
return 0;
}
我學習C++和上面的代碼片段中我迷惑。在func1中,addr4和addr6的分配是堆棧分配(對吧?)。當func1存在時,它們應該消失(-ish,內存將保存該值,直到其他人使用它)。這原本讓我覺得我對ip2int地圖的散步可能會打印垃圾。儘管如此,我仍然無法做到這一點。
因爲我還是新來的C++,我不排除我錯過了一些東西。一個副本是否發生在我不知道的地方?我以爲這對和地圖插入調用都只是引用。這意味着他們可以在某個時候引用垃圾。
好吧,足夠散漫。上面的代碼是否有效,或者我是幸運的,沒有其他東西可以用來存儲addr4和addr6的內存?
在此先感謝任何和所有幫助
我不知道增強,但一個簡單的方法來檢查是否堆棧或堆分配是使用調試器和放置斷點(例如對構造函數)。你可能有一個堆棧分配的數據,但內部字段是堆分配的...... – 2012-02-03 17:00:13
@BasileStarynkevitch你不能告訴它的堆或棧通過檢查構造函數創建相同的構造函數在兩種情況下都被調用。 – rerun 2012-02-03 17:06:58
我的意思是在構造函數中,在運行時,在'gdb'調試器下面放置一個斷點....然後,如果到達構造函數,調試器將能夠顯示其'this'隱式參數,如果該指針位於堆棧或堆上,則會有線索。 – 2012-02-03 17:19:31