我想将第一个 vector 的对象复制到第二个 vector ,但是当我删除第二个 vector 时,第一个 vector 的内容不应更改。 我该怎么做?
代码:
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();
}
我的代码中的问题是,在删除第二个 vector 时,第一个 vector 即 m_pThreadInfo->getLog() 内容也被删除了..
如何克服这个问题?
编辑:
CLog::CLog()
{
m_threadname = new char[20];
}
CLog::~CLog()
{
delete[ ] m_threadname;
}
如果我使用 CLog 作为 vector 列表的参数..我该如何删除它..
谢谢...
最佳答案
哦,伙计。您的代码中存在一些严重的问题。
首先,你有
class CLog
{
char* m_threadname;
public:
CLog()
{
m_threadname = new char[20];
}
~CLog()
{
delete[ ] m_threadname;
}
};
它是 C++,年份是 2011 年,请不要那样做。如果你这样做了,不要以性能为理由。相反,这样做:
class CLog
{
std::string m_threadname;
};
看!
其次,您复制带有指针元素 a 的 vector ,当第一个 vector 的元素消失而第二个 vector 的元素被删除时,您会感到惊讶。这是相同的元素,你知道的。 vector 只是一个容器,而不是所有者。作为程序员,您拥有这些元素。 vector 只是持有它们。
你可以使用
typedef vector<shared_ptr<CLog>> CLogData;
解决您的问题。或者,最好
typedef vector<CLog> CLogData;
在没有其他证明之前,这甚至更好。你没有给出一个很好的理由为什么这是一个坏主意。
使用堆栈,它是你的 friend 。
编辑:
此外,您需要按顺序获取引用资料。在
void CMultiThreadedDlg::DeleteData(CLogData tLogData)
{
for(size_t i = 0; i < tLogData.size()-1; ++i)
{
CLog* log = (CLog*)tLogData[i];
delete log;
}
tLogData.clear();
}
您将 vector copy 传递给DeleteData
,拷贝将被.clear()
编辑,而不是原始的。可能很危险,如果它在附近徘徊并且您认为它有有效的指针,而实际上它没有。
关于c++ - 如何将 vector 列表中的对象复制到另一个 vector 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5576731/