c++ - 使用指针创建对象访问冲突错误

标签 c++ oop pointers windows

所以我刚开始使用 C++ 进行 Windows 编程。首先我画了一些线,没问题, 然后我尝试创建一个类来绘制一些形状,当我使用普通方法创建对象时它工作正常(在代码中这些部分被注释掉), 但是当我使用指针创建新对象时,出现了Access violation 错误。

这是我的类(class)(我删除了一些代码,因此在某些部分看起来过于简单):

class shapes {
public:
   shapes(void);
   void setstartp( POINT& p0);
   void setendp( POINT& p1);

   void draw(HDC hdc);
   ~shapes(void);

   POINT x0;
   POINT x1;
};

shapes::shapes(){}

void shapes::setstartp( POINT& p0){
    x0=p0;
}

void shapes::setendp( POINT& p1){
    x1=p1;
}

void shapes::draw(HDC hdc){
    MoveToEx(hdc,x0.x ,x0.y ,0);
    LineTo(hdc ,x1.x ,x1.y);
}

shapes::~shapes(void) {}

这是我的程序,或者至少是 winproc 部分:

//shapes sh; 
shapes* sh =0;
bool mousdown =false;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    POINT p0;
    POINT p1;
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
        case WM_LBUTTONDOWN :
            SetCapture(hWnd);
            mousdown = true;

            p0.x = LOWORD(lParam);
            p0.y = HIWORD(lParam);

            // sh.setstartp(p0);
            sh = new shapes();
            sh->setstartp(p0);
            break;    
     case WM_MOUSEMOVE :
         if(mousdown) {
             p1.x = LOWORD(lParam);
             p1.y = HIWORD(lParam);
             // sh.setendp(p1);
            sh->setendp(p1);
            InvalidateRect(hWnd ,0,true);
         }
         break;    
     case WM_LBUTTONUP :
         ReleaseCapture();
         mousdown = false;
         p1.x = LOWORD(lParam);
         p1.y = HIWORD(lParam);

         // sh.setendp(p1);
         sh->setendp(p1);
         InvalidateRect(hWnd ,0,true);
         break;
     case WM_PAINT:
         hdc = BeginPaint(hWnd, &ps);
         // TODO: Add any drawing code here...
         //sh.draw(hdc);
         sh->draw(hdc);
         EndPaint(hWnd, &ps);
         break;
     case WM_COMMAND: 

这是我的访问冲突错误:

Unhandled exception at 0x00411fda in NEWWIN.exe: 0xC0000005: Access violation reading location 0x00000004.

错误指向类实现:

 void shapes::draw(HDC hdc) {           
     MoveToEx(hdc,x0.x ,x0.y ,0);
     LineTo(hdc ,x1.x ,x1.y);
 }

显然我的类属性 x0x1 有问题:

this 0x00000000 {x0={...} x1={...} } shapes * const

x0 {x=??? y=???} tagPOINT

x CXX0030: Error: expression cannot be evaluated

y CXX0030: Error: expression cannot be evaluated

x1 {x=??? y=???} tagPOINT

x CXX0030: Error: expression cannot be evaluated

y CXX0030: Error: expression cannot be evaluated

最佳答案

问题是在接收(并处理WM_LBUTTONDOWN)事件之前,您不会构建shapes 对象。因此,如果之前处理了任何其他事件(例如 WM_MOUSEMOVE),则 sh 仍将为 0。

此外,请注意这里存在内存泄漏:您为每个 WM_LBUTTONDOWN 事件调用 sh = new shapes();,而没有删除之前分配的对象。

我建议您在 WM_CREATE 处理程序中分配您的 shape 对象,并在 WM_DESTROY删除它> 处理程序。

关于c++ - 使用指针创建对象访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4804647/

相关文章:

c++ - D3D 线绘制分成三角形 - 它几乎可以工作,但需要提示

c++ - 在现有 Qt 项目中从源代码构建第 3 方库

c++ - 为什么在 C 的循环中使用 printf 的 Rust 代码不显示输出,但在 C++ 的循环中使用 std::cout 却显示输出?

java - 在 Java 中是否可以根据某个变量从两个不同的类继承一个类?

c - OOP 和 C 中的接口(interface)

php - 注意 : Use of undefined constant self - assumed 'self' , 当把 property_exists 作为第一个参数时

c++ - char * (*arr)[2 ] 和 char **array[2] 有何不同?

c - 不正确的整数转换,我怎么做错了?

c++ - lambda 函数的类型

c - 当我尝试打印(复制的)字符串时,为什么会得到一些任意数字?