使用C ++字符串

时间:2016-10-28 15:44:40

标签: c++ string c++11 memory-management dynamic-memory-allocation

我正在尝试创建一个基本程序来实现我的网络类的汉明代码

该程序在大多数情况下都能正常运行,但有一些特定情况会因-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")并预先保留内存,但没有任何选项可以使用

任何提示都将非常感谢

2 个答案:

答案 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

并查看应用在运行时会告诉您的内容。 (提示:查看atoperator []之间关于边界检查的区别)。

(另请参阅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个元素。最后一个元素写入超出保留空间,并且不可能覆盖内部用于内存管理的实际数据。给出错误信息的可能性很大。

请注意,这是黑客用来访问计算机系统的错误类型,通过找出超出该位置的内容,并通过特制输入替换为恶意内容。因此,您自己很幸运,您的代码会立即显示问题。