Присвоение переменных объекту C ++ - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок в C ++ и выхожу со следующей ошибкой при назначении значений объекту:

JNI DETECTED ERROR IN APPLICATION: non-zero capacity for nullptr pointer: 8968320

Это класс, которому я пытаюсь присвоить значение:

class DirtyRegion
{
 public:
    DirtyRegion():dirtyRects(0), numRects(0), maxRects(0) {}
    ~DirtyRegion() {}

 public:

    ARect *dirtyRects; // Array of Rects

    int    numRects; // Number of Dirty Rects in the Array

    int    maxRects; // Size of Array
};

Я думаю, что верхняя строка в конструкторе инициализирует объект, но я не совсем уверен. Как вы можете видеть, здесь есть переменная типа «ARect», которая является эквивалентом NDK для android.graphics.Rect:

typedef struct ARect {
#ifdef __cplusplus
    typedef int32_t value_type;
#endif
    /// Minimum X coordinate of the rectangle.
    int32_t left;
    /// Minimum Y coordinate of the rectangle.
    int32_t top;
    /// Maximum X coordinate of the rectangle.
    int32_t right;
    /// Maximum Y coordinate of the rectangle.
    int32_t bottom;
} ARect;

В основном методе я создаю экземпляр, используя эту строку:

android::DirtyRegion dirtyRegion;

Это работает нормально, однако, если я присваиваю значения переменным объектов, я получаю ошибки. например:

dirtyRegion.maxRects = 0;

Я что-то упустил здесь?

Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

dirtyRects создается как нулевой указатель, поэтому вам необходимо выделить память перед доступом к элементам.Вместо этого рассмотрите возможность использования std :: vector.

#include <vector>

struct ARect {
#ifdef __cplusplus
    typedef int32_t value_type;
#endif
    ARect(int _l=0, int _t=0, int _r=0, int _b=0):
        left(_l), top(_t), right(_r), bottom(_b) {}
    /// Minimum X coordinate of the rectangle.
    int32_t left;
    /// Minimum Y coordinate of the rectangle.
    int32_t top;
    /// Maximum X coordinate of the rectangle.
    int32_t right;
    /// Maximum Y coordinate of the rectangle.
    int32_t bottom;
};

class DirtyRegion
{
 public:
    DirtyRegion():dirtyRects(0), numRects(0), maxRects(0) {}
    ~DirtyRegion() {}

 public:

    std::vector<ARect> dirtyRects; // Array of Rects
    int    numRects; // Number of Dirty Rects in the Array
    int    maxRects; // Size of Array
};

int main()
{
    DirtyRegion dirtyRegion;
    dirtyRegion.dirtyRects.push_back(ARect(0,0,0,0));

    return 0;
}
...