代码之家  ›  专栏  ›  技术社区  ›  jramm

将指针声明为类成员C++

  •  1
  • jramm  · 技术社区  · 10 年前

    我正在尝试编写一个C++类,其中包含一些指向int的指针作为私有成员。 我在尝试为指针地址赋值时遇到了以下异常:

    Unhandled exception at 0x000B140A in test.exe: 0xC0000005: Access violation      writing location 0x00000000.
    

    以下是在我的机器上重现问题的最小代码量

    #include "stdafx.h"
    
    class Chunker {
      public:
        Chunker(int cx, int cy);
    
      private:
        int chunkSizeX, chunkSizeY;
        int *yOff, *xOff;
      };
    
    Chunker::Chunker(int cx, int cy){
      chunkSizeX = cx;
      chunkSizeY = cy;
      *xOff = 0;
      *yOff = 0;
    }; 
    
    int main(int argc, char *argv)
    {
      Chunker chunker(12, 12);
      return 0;
    }
    

    我就是搞不清楚这里出了什么问题?

    2 回复  |  直到 10 年前
        1
  •  7
  •   Cory Kramer    10 年前

    您需要为指针声明内存

    Chunker::Chunker(int cx, int cy)
      :  chunkSizeX{cx}, 
         chunkSizeY{cy}
    {
        xOff = new int(0);
        yOff = new int(0);
    }
    

    否则,您将为还没有地址的指针赋值。

    显然,如果您的类是分配内存的类,那么您也需要清理它

    Chunker::~Chunker()
    {
        delete xOff;
        delete yOff;
    }
    

    如果您的类是分配内存的类,那么您可能还需要考虑让成员

    std::unique_ptr<int> xOff;
    std::unique_ptr<int> yOff;
    
        2
  •  2
  •   tofi9    10 年前

    @Cuber回复的替代方案是替换 *xOff = 0; 通过 xOff = nullptr; (没有 * ). 但为什么是指针?

    Chunker::Chunker(int cx, int cy)
      :  chunkSizeX{cx}, 
         chunkSizeY{cy}
    {
        xOff = nullptr;
        yOff = nullptr;
    }
    
    ...
    
    Chunker::~Chunker()
    {
        delete xOff;
        delete yOff;
    }