我喜欢将第一个向量的对象复制到第二个向量,但是当我删除第二个向量时,第一个向量内容不应该更改。 我怎么能这样做?
CODE:
typedef vector<CLog*> CLogData;
CLogData CMultiThreadedDlg::CopyLogData()
{
CLogData logdata;
for(size_t i = 0; i < m_pThreadInfo->GetLog().size()-1; ++i)
{
CLog* plog = new CLog(*m_pThreadInfo->GetLog()[i]);
logdata.push_back(plog);
}
return logdata;
}
DeleteData(logdata);
void CMultiThreadedDlg::DeleteData(CLogData tLogData)
{
for(size_t i = 0; i < tLogData.size()-1; ++i)
{
CLog* log = (CLog*)tLogData[i];
delete log;
}
tLogData.clear();
}
我的代码中的问题是,在删除第二个向量时,第一个向量即 m_pThreadInfo-&gt; getLog()内容也被删除..
如何克服这个问题?
编辑:
CLog::CLog()
{
m_threadname = new char[20];
}
CLog::~CLog()
{
delete[ ] m_threadname;
}
如果我使用CLog作为矢量列表的参数..我可以删除这个..
...谢谢
答案 0 :(得分:4)
哦,伙计。你的代码中有一些严重的问题。
首先,你有
class CLog
{
char* m_threadname;
public:
CLog()
{
m_threadname = new char[20];
}
~CLog()
{
delete[ ] m_threadname;
}
};
这是C ++而今年是2011年,请不要这样做。如果你这样做,不要声称性能是一个原因。相反,这样做:
class CLog
{
std::string m_threadname;
};
请参阅!
其次,您使用指针元素复制向量,并在删除第二个向量元素时第一个向量元素消失时感到惊讶。你知道,它是相同的元素。向量只是一个容器,而不是所有者。作为程序员,您拥有这些元素。矢量只是拥有它们。
您可以使用
typedef vector<shared_ptr<CLog>> CLogData;
解决您的问题。或者,最好是
typedef vector<CLog> CLogData;
除非另有证明,否则更好。你没有充分说明为什么这是一个坏主意。
使用堆栈,这是你的朋友。
修改强>
此外,您需要按顺序获取参考。在
void CMultiThreadedDlg::DeleteData(CLogData tLogData)
{
for(size_t i = 0; i < tLogData.size()-1; ++i)
{
CLog* log = (CLog*)tLogData[i];
delete log;
}
tLogData.clear();
}
您将矢量复制传递给DeleteData
,副本将为.clear()
- ed,而不是原始版本。可能是危险的,如果它挂起来,你认为它有有效的指针,它没有。
答案 1 :(得分:2)
通过vector<CLog*>
,程序变得不必要地变得复杂。我建议您使用vector<CLog>
代替vector<CLog*>
。通过该修改,您无需担心明确删除向量的内容。您可以使用赋值运算符将一个向量的元素复制到另一个向量。
关于向量的赋值操作的注释 -
#include <vector>
#include <iostream>
using namespace std;
int main()
{
foo obj(10) ;
vector<int> a(5), b(5) ;
for( int i=0 ; i<5; ++i )
a[i] = i ;
b = a; // Assignment
cout << b[2] << "\t" << a[2] << "\n";
b[2] = 25;
cout << b[2] << "\t" << a[2] << "\n";
return 0 ;
}
输出:
2 2
25 2
看到修改向量 b
不会影响a
。因此,如果类型为CLog
,则您的注释不正确,分配操作也会修改其他向量。
由于该类具有元素char*
,因此赋值操作不会执行深层复制。请改用std::string
。