Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #13647

Re: Error ::: *** glibc detected *** ./a.out: double free or corruption (out):

From jt@toerring.de (Jens Thoms Toerring)
Newsgroups comp.lang.c++
Subject Re: Error ::: *** glibc detected *** ./a.out: double free or corruption (out):
Date 2012-01-29 12:15 +0000
Organization Freie Universitaet Berlin
Message-ID <9okrj8Fe93U1@mid.uni-berlin.de> (permalink)
References <e2f17379-c307-4b33-bfe4-12d1f9867343@i10g2000pbl.googlegroups.com>

Show all headers | View raw


Pallav singh <singh.pallav@gmail.com> wrote:
> i am allocating all the STL dataStructre on Stack .... but Facing
> double free or corruption (out).
> Kindly Help me .

> [root@arnav Dynamic_Programming]# ./a.out
>   Value of Rod Cut  0  with First OptimalCut at   0  Total Cost  0
>   Value of Rod Cut  1  with First OptimalCut at   1  Total Cost  1
>   Value of Rod Cut  2  with First OptimalCut at   2  Total Cost  5
>   Value of Rod Cut  3  with First OptimalCut at   3  Total Cost  8
>   Value of Rod Cut  4  with First OptimalCut at   2  Total Cost  10
>   Value of Rod Cut  5  with First OptimalCut at   2  Total Cost  13
>   Value of Rod Cut  6  with First OptimalCut at   6  Total Cost  17
>   Value of Rod Cut  7  with First OptimalCut at   1  Total Cost  18
>   Value of Rod Cut  8  with First OptimalCut at   2  Total Cost  22
> *** glibc detected *** ./a.out: double free or corruption (out):
> 0x0817a0d8 ***
> *** glibc detected *** ./a.out: free(): invalid size: 0x0817a100 ***

> [root@arnav Dynamic_Programming]# cat RodCut.cc
> # include <stdio.h>
> # include <limits.h>
> # include <iostream>
> # include <vector>

> using namespace std;

It's normally frowned upon to pull in all of the 'std' name-
space. Better declare what exactly you need from it. But that
hasn't any bearing on your problem here.

> // Find the Best way of Rod Cut of Length N.
> // Assume each Length of Rod has a price Pi.

> void
> OptimalValue (vector <unsigned int>  cost, unsigned int length)
> {
>     unsigned int  i,  j;
>     unsigned int  min;

I would define them only when they are actually needed.

>     // Here we store result of OverLapping Problems
>     // which we can use as Computation Grows
>     vector <unsigned int>  Optimal_Value (length, 0);
>     vector <unsigned int>  First_Optimal_Cut (length, 0);

>     Optimal_Value[0] = 0;
>     First_Optimal_Cut[0] = 0;

Both arrays are already initialized (for all elements) to 0,
so this is redundant.

>     for (i = 1; i <= length; i++)

'length' is the length of all the arrays you have here, so the
maximum index into these arrays you can use is 'length - 1'.
By having 'i' run up the value of 'length' you access and
assign to elements past the end of some of them. This can
easily result in all kinds of strange errors since you have
written to memory you shouldn't have and may have overwrit-
ten important information. As long a you're not 100% sure
that all array indices are ok you can use the at() function
instead of the [] operator - the program will then throw an
out of range exception if you made a mistake.

>     {
>        min = 0;
>        for (j = 1; j <= i ; j++)
>            if (min < (cost[j] + Optimal_Value[i - j]))
>            {
>                min = cost[j] + Optimal_Value[i - j];
>                First_Optimal_Cut[i] = j;
>            }

>         Optimal_Value[i]  = min;
>     }

>     for (i = 0 ; i < length ; i++)
>     {
>        unsigned int price = 0;
>        unsigned int k = i;

>        while(k > 0)
>        {
>           price = price + cost[First_Optimal_Cut[k]];
>           k = k - First_Optimal_Cut[k];
>        }
>        cout << "  Value of Rod Cut  " <<  i  <<  "  with First
> OptimalCut at   " << First_Optimal_Cut[i]
>             << "  Total Cost  " << price << endl;
>     }
> }

> int main()
> {
>    //  length i  = 0  1  2  3  4  5    6   7   8
>    //  price pi  = 0  1  5  8  9  10  17  17  20

> // i    0   1   2   3   4   5   6   7   8
> // ri   0   1   5   8   10  13  17  18  22
> // si   0   1   2   3   2   2   6   1   2

>    vector<unsigned int > price;

>    price.push_back(0);
>    price.push_back(1);
>    price.push_back(5);
>    price.push_back(8);
>    price.push_back(9);
>    price.push_back(10);
>    price.push_back(17);
>    price.push_back(17);
>    price.push_back(20);

>    OptimalValue (price, price.size());

Why do you pass the size? The 'price' vector knows all by
itself how large it is - this isn't a simple array.

                            Regards, Jens
-- 
  \   Jens Thoms Toerring  ___      jt@toerring.de
   \__________________________      http://toerring.de

Back to comp.lang.c++ | Previous | Next — Previous in thread | Find similar | Unroll thread


Thread

Error ::: *** glibc detected *** ./a.out: double free or corruption (out): Pallav singh <singh.pallav@gmail.com> - 2012-01-29 02:25 -0800
  Re: Error ::: *** glibc detected *** ./a.out: double free or corruption (out): Paavo Helde <myfirstname@osa.pri.ee> - 2012-01-29 05:56 -0600
  Re: Error ::: *** glibc detected *** ./a.out: double free or corruption (out): jt@toerring.de (Jens Thoms Toerring) - 2012-01-29 12:15 +0000

csiph-web