我正试图解决为什么这样做的问题。据我所知,当我动态分配3个整数时,它不应该让我在索引2之后添加更多,但下面的代码编译并运行得非常好。这是为什么?
#include <iostream>
int main() {
int* nums = new int[3];
nums[0] = 5;
nums[1] = 6;
nums[2] = 5;
nums[3] = 7;
nums[4] = 8;
for(int i = 0; i <= 4; i++) {
std::cout << nums[i] << std::endl;
}
delete nums;
return 0;
}
答案 0 :(得分:0)
如评论中所述,您正在访问其他内存并在行上为其分配值:
nums[3] = 7;
nums[4] = 8;
由于您为阵列分配了3
个插槽,因此需要分配内存,但是当您使用pointers
时,您可以直接访问内存位置,这样您就可以自由地跳出你的数组内存空间并冒险进入unknown
内存。
这是非常糟糕练习,因为您不知道这些内存位置上的内容。
答案 1 :(得分:-1)
C ++是一种不安全的语言。如果在堆上分配3个int
,则必须确保以后不要尝试写入第4个或第5个int
的位置。 C ++会允许你在那里写,即使这是一个坏主意。
这个问题的一个解决方案是几乎从不使用语言中内置的指针。你可以制作或使用别人的指针类。它应该是一个模板类,这样你就可以指向任何东西:pntr<int>
,pntr<Car>
,pntr<ostream>
,pntr<string>
等......
过载:
operator new[]
如果您尝试写入不应该的位置,您的指针类可能会抛出错误。
#include <iostream>
#include "pntr.h"
int main() {
pntr<int> nums = new int[3];
nums[0] = 5;
nums[1] = 6;
nums[2] = 5;
nums[3] = 7; // THROWS AN ERROR
nums[4] = 8;
delete nums;
return 0;
}