2009-06-17 57 views
1

蔭2006 C++STL矢量添加使用Borland序列

class A 
{ 
private: 
    TObjectList* list; 
    int myid; 
public: 
__fastcall A(int); 
__fastcall ~A(); 
}; 

__fastcall A::A(int num) 
{ 
    myid = num; 
    list = new TObjectList(); 
} 

__fastcall A::~A() 
{ 
} 

int main(int argc, char* argv[]) 
{ 
    myfunc(); 
    return 0; 
} 

void myfunc() 
{ 
    vector<A> vec; 
    vec.push_back(A(1)); 
} 

當我一個新的對象A添加到該載體時,它調用其析構函數兩次,然後一旦當VEC超出範圍,所以在總共3個倍。

我在想它應該在添加對象時調用一次,然後在vec出去時調用一次scope。

+0

作爲一個方面說明。 RAW指針的使用沒有複製構造函數和賦值操作符是非常危險的。 – 2009-06-17 22:45:16

回答

6

表達式A(1)是一個r值並構造了一個新的A值,然後編譯器可以將其複製到一個臨時對象中,以便綁定到push_back採用的const引用。然後該參考文件綁定的臨時文件被複制到由vector管理的存儲中。

允許編譯器在許多情況下刪除臨時對象,但不要求這樣做。

+1

它爲什麼要做一個副本來將一個右值綁定到一個const引用? – Zifre 2009-06-17 20:51:57

+0

另一種可能性是由於某種原因(例如它需要增長),矢量重新分配,並且它爲此創建了一個副本。 – Zifre 2009-06-17 20:52:51

0

當您點擊斷點時,單擊調試器底部的調用堆棧選項卡。這樣,您可以找到每個呼叫的上下文。

+0

或添加打印語句。 – 2009-06-17 22:41:15

1

試試這個:

#include <iostream> 
#include <vector> 

class A 
{ 
    private: 
     public: 
      A(int num) 
      { 
       std::cout << "Constructor(" << num << ")\n"; 
      } 
      A(A const& copy) 
      { 
       std::cout << "Copy()\n"; 
      } 
      A& operator=(A const& copy) 
      { 
       std::cout << "Assignment\n"; 
       return *this; 
      } 
      A::~A() 
      { 
       std::cout << "Destroyed\n"; 
      } 
}; 

int main(int argc, char* argv[]) 
{ 
    std::vector<A> vec; 
    vec.push_back(A(1)); 
} 

輸出我的機器上是:

> ./a.exe 
Constructor(1) 
Copy() 
Destroyed 
Destroyed 
>