数组越界或错误等于 nullptr?C++
array out of bounds or wrong equals to nullptr? c++
我有一个给我带来麻烦的方法。我收到分段错误错误。我通过gdb运行了测试,发现问题出在以下方法购物列表数组包含指向产品类对象的指针。我在这里要做的是添加一个项目,我遍历数组,直到找到 nullptr 或空白空间。数组的大小为 20,最初使用构造函数全部设置为 nullptr。数字 =20阵列在客户订单中的位置。
public:
static const size_t number = 20;
private:
std::array<Product*, number> shoppingList;
我如何在构造函数中初始化它:
CustomerOrder::CustomerOrder()
: shoppingList()
{
}
这就是问题方法。
void CustomerOrder::addItem(Product *p)
{
bool space = false;
int counter=0;
while(space==false || counter < 20 )
{
if(shoppingList[counter] == nullptr )
{
shoppingList[counter] = p;
space == true;
}
counter++;
}
你需要在 while 子句中&&
因为space == false
它将是(true || false
)如果你做一个&&陈述,你将始终有一个真实的陈述,你希望确保两种情况仍然是正确的,而不是一个或另一个是真的。
while(space==false && counter < 20 )
第一次运行此循环:
while(space==false || counter < 20 )
{
// ...
}
它将用指针p
填充数组。下次运行循环时,它将写入数组末尾p
。我认为你想要一个&&
而不是一个||
运算符。
问题是你的状况:
while(space==false || counter < 20 )
这应该更改为:
while(space==false && counter < 20 )
更好的方法是:
for (size_t i = 0; i < CustomerOrder::number; ++i) {
if (shoppingList [counter] == nullptr) {
shoppingList [counter] = p ;
break ;
}
}
如果你有#include <algorithm>
,那么这可以进一步简化为:
auto iter = std::find (std::begin (shoppingList), std::end (shoppingList), nullptr) ;
if (iter != std::end (shoppingList) {
*iter = p ;
}
相关文章:
- 如何在自删除后将对象设置为nullptr
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 将指针设置为"nullptr"并不能防止双重删除?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 为什么我的节点在我设置后被设置为 nullptr = 新节点?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- 当设置为 const 变量时使用 nullptr
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 检查类方法中是否(此 == nullptr)
- C++98,但叮叮当当地说使用nullptr?
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 检查nullptr是否100%保护内存布局不受segfault影响
- 向unordered_map添加unique_ptr时'this was nullptr'
- 使用 nullptr 作为 std::unordered_map 的键有什么后果吗?