我正在尝试创建一个基本程序来实现我的网络类的汉明代码
该程序在大多数情况下都能正常运行,但有一些特定情况会因-1073741819
程序采用一串'0'和'1'作为输入
如果输入字符串的格式为odd number ^ 2
,则会出现错误-1073741819 std::bad_alloc
所有其他案件似乎都有效 示例输入8件作品,10件作品但9件作品不起作用 类似地输入长度为24的作品,26作品,但25不作为
以下是代码
它包含一些不会产生错误的代码,并且我标记了不相关的部分何时开始。
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
int main(){
string data;
cout<<"Enter data to send => :\n";
cin>>data;
int len = data.length();
int maxPowerOfTwo = log2(len-1) + 1;
int totalLength = len + maxPowerOfTwo + 1;
vector< int > toSend;
toSend.reserve(totalLength);
toSend[0] = 0;
int l = 0;
int k = 0;
for(int i=0;i<totalLength+1;i++){
if(l==i){
toSend[i] = 0;
if(l==0){
l++;
}
else{
l*=2;
}
}
else{
toSend[i] = data[k]-48;
k++;
}
}
int currentPower = 0;
int startPosition = 1;
for(;currentPower<maxPowerOfTwo+1;currentPower++){
int tempSum = 0;
int tempCounter = 0;
for(int currentPosition = startPosition;currentPosition<totalLength+1;){
tempSum = tempSum + toSend[currentPosition];
tempCounter++;
if(tempCounter==startPosition){
currentPosition += startPosition + 1;
tempCounter = 0;
}
else{
currentPosition++;
}
}
if(tempSum%2!=0){
toSend[startPosition] = 1;
}
else{
toSend[startPosition] = 0;
}
startPosition*=2;
}
string finaltoSend;
for(int i=1;i<=totalLength;i++){ // MARKED LOOP
if(toSend[i]==0){
finaltoSend.push_back('0');
}
else{
finaltoSend.push_back('1');
}
}
/*
==== NOT RELEVANT ====
cout<<"\nData to send => "<<finaltoSend<<'\n';
string received = finaltoSend;
cout<<"\nEnter data received of length "<<totalLength<<'\n';
cin>>received;
int t_len = received.length();
int t_maxPowerOfTwo = log2(t_len-1);
int t_currentPower = 0;
int t_startPosition = 1;
int errorAt = -1;
for(;t_currentPower<t_maxPowerOfTwo+1;t_currentPower++){
int tempSum = 0;
int tempCounter = 0;
for(int currentPosition = t_startPosition;currentPosition<t_len+1;){
tempSum = tempSum + received[currentPosition-1] - 48;
tempCounter++;
if(tempCounter==t_startPosition){
currentPosition += t_startPosition + 1;
tempCounter = 0;
}
else{
currentPosition++;
}
}
if(tempSum%2!=0){
errorAt+=t_startPosition;
}
t_startPosition*=2;
}
if(errorAt == -1){
cout<<"\nNo error";
}
else{
errorAt++;
cout<<"\n\nError at \n\n"<<errorAt;
}
==== END ====
*/
return 0;
}
使用标志和基本调试进行调试(打印我的位置)时发现程序在标记循环的第二次迭代中断了
**调试new_allocator.h
时指向
程序结束时void deallocate(pointer __p, size_type){ ::operator delete(__p); }
我试过了
finaltoSend.append("0")
并预先保留内存,但没有任何选项可以使用
任何提示都将非常感谢
答案 0 :(得分:4)
vector< int > toSend;
toSend.reserve(totalLength);
//...
for(int i=0;i<totalLength+1;i++){
// Say...what? --------^
toSend[i] = // different values on the two branches
在保留长度之外写作?
尝试使用
toSend.at(i)= // whatever
并查看应用在运行时会告诉您的内容。 (提示:查看at和operator []之间关于边界检查的区别)。
(另请参阅why doesn't my program crash when I write past the end of an array?提示:您可能会损害您的记忆并在以后遇到崩溃:请参阅好书&#39; fandango on core)。
答案 1 :(得分:2)
您的代码中确实存在两个错误。
第一个是你只为元素保留记忆,但不要让它们存在。
这不太可能是您看到的行为的原因(为什么您在技术上写入未使用的内存,该内存不能被其他内容使用,但是当您进一步使用向量时,这是一个等待发生的潜在错误;也是因为{ {1}}是POD,它们不需要构造函数来调用,因此您不会看到由未初始化对象引起的问题,如果对其他对象的向量使用相同的错误方法,则会发生更改。
要实际使用这些整数,请使用int
代替resize
。
第二个错误是你甚至到了保留的内存之外:为reserve
元素保留空间,然后写totalLength
个元素。最后一个元素写入超出保留空间,并且不可能覆盖内部用于内存管理的实际数据。给出错误信息的可能性很大。
请注意,这是黑客用来访问计算机系统的错误类型,通过找出超出该位置的内容,并通过特制输入替换为恶意内容。因此,您自己很幸运,您的代码会立即显示问题。