空引用异常c ++

时间:2016-06-07 20:58:00

标签: c++-cli

我一直在控制台中收到此错误:

  

未处理的异常:System.NullReferenceException

以下是代码:

class Car {
public:
   int X;
   int Y;
};

class SpecificCar : public Car {

};

class Container {
public:
   int AmountOfCars = 0;
   Car **cars = nullptr;
   void AddCar(Car *ptr);
};

void Container::AddCar(Car *ptr) {
    if(AmountOfCars == 0) {
    cars[0] = ptr; //Debbuger says that the problem in question is located here
    AmountOfCars++;
    }

int main() {
    Container container;
    Car *ptr = new SpecificCar;
    ptr->X = 1;
    ptr->Y = 5;
    container.AddCar(ptr);
}

4 个答案:

答案 0 :(得分:0)

虽然您的Container设计不存储Car,但它仍然需要存储指向汽车的指针。你必须想出一个方法。标准提供std::vector<Car>以及std::vector<Car*>,但您可以自由地提出其他任何内容。尽管如此,如果你不想要标准方法,那么你真正取决于你想要做什么。

答案 1 :(得分:0)

Car **cars不是动态容器,它是指向内存区域的指针。你在那里所做的完全是错的。您仍然需要分配一个指针数组才能在那里填充数据,例如

cars = new Car*[5];

使用它可以在数组cars[]内使用0到4的索引进行寻址。再次,这不是动态的,你最好的选择是std::vector<Car*>,如果你想按自己的方式进行malloc() / realloc(),如果你真的想打扰它,可能会链接到列表

答案 2 :(得分:0)

问题在于,在课程 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let v = UIViewController() v.view=UIView(frame: CGRectMake(0,0,self.view.frame.size.width,200)) v.view.backgroundColor=UIColor.redColor() v.hidesBottomBarWhenPushed = false self.tabBarController?.navigationController?.hidesBottomBarWhenPushed = false self.tabBarController?.navigationController?.pushViewController(v, animated: true) } 中,您将成员Container定义为cars

解决此问题的最佳方法是使用nullptr std::vector<Car*>。如果你绝对不想使用向量(为什么?),在课程cars中,你可以替换:

Container

通过以下方式:

Car **cars = nullptr;

将定义static const int MAX_AMOUNT_OF_CARS = 100; Car* cars[MAX_AMOUNT_OF_CARS]; 的正确数组;然后,您将可以使用Car*cars[0],...

答案 3 :(得分:0)

我认为你正在尝试自学内存管理。我已经重写了你的课程,AddCar()更符合你的要求。访问或移除汽车并删除容器留给学生练习。 (将其视为伪代码。我没有编译或运行它。)

    class Container 
    {
            Car ** cars_ = nullptr;
            int capacity_ = 0;      // how much room we have for car pointers
            int AmountOfCars_ = 0;  // how many car pointers we actually contain
        public:
            int AmountOfCars() const { return AmountOfCars_; }
            void AddCar(Car *ptr);
    };

    void Container::AddCar(Car *ptr) 
    {
        if ( AmountOfCars_ + 1 > capacity_ ) // ensure we have capacity for another Car *
        {
            if ( capacity_ == 0 ) // if we have none set to 2, so we'll initially allocate room for 4
                capacity_ = 2;
            int newcapacity = capacity_ * 2;                    // double the capacity
            Cars ** newcars = new Car*[ newcapacity ];          // allocate a new pointer array
            memcpy( newcars, cars_, capacity_ * sizeof(Car*) ); // we're just moving pointers
            delete cars_;                                       // get rid of the old pointer array
            cars_ = newcars;                                    // point to the new pointer array
            capacity_ = newcapacity;                            // update the capacity
        }
        ++AmountOfCars_;                                        // increase the number of cars
        cars[ AmountOfCars_ ] = ptr;                            // and copy the pointer into the slot
    }