3,881
社区成员
发帖
与我相关
我的任务
分享
class A
{
};
A* a = new A();
new(a)A();
这样的写法是可以直接用的
再者delete a;之后再调用new(a)A()明显是内存越界操作了
template<typename T>
friend inline T &operator= (T &a ,const T &b) {
a.~T () ;
new (&a) T (b) ;
return a ;
}
让默认行为是这样
但是编译器默认不是这样,而且也不支持全局重载=inline void *__cdecl operator new (unsigned int size ,void *where) throw () {
return where ;
}
template <typename T>
inline void memcpy (T &a ,const T &b) {
const unsigned int i = sizeof (T) ;
__asm {
mov ecx,i
mov esi,[b]
mov edi,[a]
rep movs byte ptr es:[edi],byte ptr [esi]
}
}
class A {
private :
int i[10] ;
public :
A () {i[0] = i[9] = -1 ;}
} ;
class B {
private :
int i[10] ;
public :
B () {i[0] = i[9] = -1 ;}
inline B (const B &b) {
memcpy<B> (*this ,b) ;
}
inline ~B () {}
inline B &operator= (const B &b) {
this->~B () ;
new (this) B (b) ;
return *this ;
}
} ;
class C {
private :
int (&i)[10] ;
public :
C () :i (*(int (*)[10]) new int [10]) {i[0] = i[9] = -1 ;}
C (const C &b) :i (*(int (*)[10]) new int [10]) {
memcpy<int [10]> (i ,b.i) ;
}
~C () {delete [] &i ;}
C &operator= (const C &b) {
this->~C () ;
new (this) C (b) ;
return *this ;
}
} ;
int main () {
A a0 ,a1 ;
B b0 ,b1 ;
C c0 ,c1 ;
a0 = a1 ;
b0 = b1 ;
c0 = c1 ;
return 0 ;
}
看以上的operator=我希望编译器自动生成,而不是我自己写