2017-06-08 50 views
1

類聲明:添加類cotaining的std ::線程矢量

class cA{ 
private: 
    std::thread t; 
public: 
    cA()=default; 
}; 

Somehere在另一個源文件:

cA *a = new cA(); 
std::vector<cA> v; 
v.push_back(*a); 

這導致在編譯時以下錯誤:

C2280: cA::cA(const cA &)': attempting to reference a deleted function 

我認爲這可能與std::thread缺少拷貝構造函數和tha t矢量試圖製作cA對象的副本。有人願意解釋嗎?

+3

(1)線程是不可拷貝,和(2)這三條線'CA * A =新的CA(); ; std :: vector v; v.push_back(* a);'相當強烈地暗示你需要早點去理解C++指針。你來自Java背景嗎?這是Java難民的典型錯誤。 –

+0

你會詳細解釋一下(2)有什麼問題嗎?我的意思是這只是我在這裏寫的示例代碼,但看看你的反應,我很好奇。我的意思是關於指針,我認爲我很好(我來自Reverse Engi字段; P) – Rafal

+0

幾乎所有的東西都是錯的。這不是你如何在C++中填充對象的向量。我重複我的問題,你是從Java背景來的嗎? –

回答

2

std::thread不可複製,所以編譯器無法生成默認的拷貝構造函數,因爲它不知道該如何處理類中的不可複製類型。它會在新副本中放入std::thread變量?

,因爲它不能產生拷貝構造函數,就好像你在你的類定義說

cA(const cA &) = delete; 

被刪除,是相同的。

下面是當它能做和不能創建一個隱含的拷貝構造函數的規則:

http://en.cppreference.com/w/cpp/language/copy_constructor

行有關你的情況是:

T具有非靜態數據成員無法複製(已刪除,無法訪問或不明確的複製構造函數);

此外,正如您的問題的評論指出的那樣,即使它編譯了,您的實際代碼也不好。它會泄漏一個cA對象。正確的代碼在這裏(固定根據註釋):

v.emplace_back(); // since the cA constructor takes no parameters 

v.push_back(cA()); 

這些都不需要cA,因爲使用它的移動構造函數可拷貝。

+0

我只是不同意在此討論中對指針/內存泄漏施加如此大的壓力。我的問題只是與錯誤和我懷疑的原因有關,因爲缺少拷貝構造函數。在我的真實情況下*有*需要動態分配內存,並且有一個參數化構造函數,在這裏我想這些都是無關緊要的。一個需要刪除v,並且不會有任何泄漏。 – Rafal

+0

@Rafal這就是爲什麼它只是一個「也」部分。但也許有人來找這個問題不會知道它不好。請記住,堆棧溢出的答案不僅僅針對提問的人。 – xaxxon

0

您也可以嘗試

v.push_back(std::move(*a));