查看下面的Reset
功能。我知道调用this
的构造函数和析构函数可能很危险,但是我真的找不到下面的错误。我在这里问这个是因为我找不到任何与谷歌有关的资料。我能找到的就是不要在另一个构造函数中调用构造函数,我显然同意这一点。但是在成员函数中的析构函数之后立即调用构造函数是不安全的?
template<typename T>
class Array{
private:
T* m_p;
Array(const Array&);
Array& operator=(const Array&);
public:
Array(){
m_p=0;
}
Array(int length):
m_p(new T[length]){}
~Array(){
delete[] m_p;
}
void Reset(int length){
this->~Array();
new(this) Array(length);
}
};
答案 0 :(得分:1)
即使你最喜欢的实现允许你这样做,这仍然是一个非常糟糕的做法。 你需要考虑的主要是两件事:
在构造函数结束之前,对象的构造不正确。
调用其析构函数后,不应访问对象。
使用构造函数和析构函数播放技巧不是一个好主意。它们分别用于引入和移除对象。使用它们超过这些角色表明您的设计有些问题。在硬币的另一面,成员函数也不应该调用它的对象的析构函数。即使它有效,它仍然是一个设计问题。
答案 1 :(得分:0)
此代码
void Reset(int length) {
delete[] m_p;
m_p = new T[length];
}
很糟糕。
为什么不
std::vector
或只使用In [50]: s = Series(pd.date_range('20000101',freq='D',periods=10000))
In [51]: result = s.where(s.dt.weekday==0,pd.TimedeltaIndex(7-s.dt.weekday,unit='d')+s)
In [52]: expected = s.apply(lambda x: x + pd.DateOffset(days=7-x.weekday()) if x.weekday() else x)
In [53]: (result==expected).all()
Out[53]: True