我一直在控制台中收到此错误:
未处理的异常: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);
}
答案 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
}