c**********e 发帖数: 2007 | 1 Result: Segmentation fault
____________________________
#include
#include
using namespace std;
class Point {
public:
Point(int xx, int yy):x(xx),y(yy) {}
private:
int x, y;
};
struct RectData {
Point ulhc;
Point lrhc;
};
class Rectangle {
public:
Rectangle(Point co1,Point co2) { pData->ulhc=co1; pData->lrhc=co2; }
private:
auto_ptr pData;
};
int main() {
Point coord1(0,0);
Point coord2(100,100);
Rectangle rec(coord1,coord2);
return |
z****e 发帖数: 2024 | 2 auto_ptr 要有new 吧?没有dynamiclly allocated memory 怎么用auto_ptr? |
z****e 发帖数: 2024 | 3 下面这个调试过了。
但是觉得改动比较大,看着很水。
等着哪位大牛给说说用auto_ptr的事了。
另外,像我这样在ctr里加一个new,op=很可能要重写的。我没写。
#include
#include
using namespace std;
class Point {
public:
Point(){}//加一个ctr
Point(int xx, int yy):x(xx),y(yy) {}
private:
int x, y;
};
struct RectData {
Point ulhc;
Point lrhc;
};
class Rectangle {
public:
Rectangle(Point co1,Point co2) {
pData=new RectData();//加一个new
pData->ulhc=co1; pData->lrhc=co2;
}
virtual ~Rectangle(){//加一个dtr
if(pData)delete pData; |
z****e 发帖数: 2024 | 4 感觉,
1,
struct RectData {
Point ulhc;
Point lrhc;
};
这个玩意没办法初始化,因为default的ctr被你给禁止了。
2.auto_ptr pData
这个为什么不行,还不是很清楚。 |
z****e 发帖数: 2024 | 5 如果要用auto_ptr, class Rectangle implementation 改成这个:
class Rectangle {
public:
Rectangle(Point co1,Point co2):pData(new RectData) { //注意加new
pData->ulhc=co1; pData->lrhc=co2;
}
private:
auto_ptr pData;
};
感觉auto_ptr=new RectData();这个是错的。
希望有大侠给解释一下auto_ptr的初始化注意事项。 |
c**********e 发帖数: 2007 | 6 zaoxie,
Thank you for all your input. With it, I figured it out. The problem
is the initialization/assignment of auto_ptr. For an int example,
the right/wrong way for assignment are as followings.
auto_ptr p1(new int(1)); // Ok
auto_ptr p2 = new int(2); // Error, explicit constructor
Yes, RectData also needs a constructor. Thank you. The following code works.
____________________
#include
#include
using namespace std;
class Point {
public:
Point(int xx, int y |
t****t 发帖数: 6806 | 7 初学者还是不要用auto_ptr的好, 一不小心就错了. 可以说是步步陷阱.
直接用tr1::shared_ptr好了.
【在 z****e 的大作中提到】 : 如果要用auto_ptr, class Rectangle implementation 改成这个: : class Rectangle { : public: : Rectangle(Point co1,Point co2):pData(new RectData) { //注意加new : pData->ulhc=co1; pData->lrhc=co2; : } : private: : auto_ptr pData; : }; : 感觉auto_ptr=new RectData();这个是错的。
|
z****e 发帖数: 2024 | 8 弟子谨遵。
【在 t****t 的大作中提到】 : 初学者还是不要用auto_ptr的好, 一不小心就错了. 可以说是步步陷阱. : 直接用tr1::shared_ptr好了.
|
c*****o 发帖数: 178 | 9 auto_ptr p2 = new int(2); // Error, explicit constructor
这个错误好像是因为不能直接将一个地址或对象赋给auto_ptr。可能因为auto_par中的
重载的assignment operator不允许这样,只允许将一个auto_ptr赋给另一个auto_ptr
works.
【在 c**********e 的大作中提到】 : zaoxie, : Thank you for all your input. With it, I figured it out. The problem : is the initialization/assignment of auto_ptr. For an int example, : the right/wrong way for assignment are as followings. : auto_ptr p1(new int(1)); // Ok : auto_ptr p2 = new int(2); // Error, explicit constructor : Yes, RectData also needs a constructor. Thank you. The following code works. : ____________________ : #include : #include
|