質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

13186閲覧

C++の"double free or corruption (out)"の修正方法が知りたいです。おそらくvectorに問題がありそうな気がするのですが。

ratera

総合スコア54

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/11/28 03:44

編集2021/11/28 03:57

以下のプログラムを動かした際に、"double free or corruption (out)"と表示されてしまいます。修正方法のご教授をお願いします。
ダブルフリー(メモリの2重解放)が原因とのことですが、どのタイミングで解放されているのかという所から理解できていません。

###### 問題の切り分けのために、試したことは以下2点です。

  1. 入力時に再現するデータ

・vector<int> B={5,3,2,1};//こちらだとエラーになる
・vector<int> B={4,1,3,2,5};//こちらだとエラーにならない
2. エラーの発生箇所の確認
・solotionメソッドの、return 0;の直前まで動作することを確認しています

###### エラーの内容

double free or corruption (out)

[1] 3070 abort (core dumped) ./a.out

再現環境

vscode上、codilityのサイト上の2か所共におきます。

C++コード

こちらの問題を解いていました。
PermCheck https://app.codility.com/programmers/lessons/4-counting_elements/perm_check/

C++

1#include <bits/stdc++.h> 2#define rep(i, n) for (int i = 0; i < (n); ++i) 3#define rep1(i, n) for (int i = 1; i <= (n); ++i) 4using namespace std; 5using ll = long long; 6using P = pair<int, int>; 7 8int max(std::vector<int> v) 9{ 10 int maxVal = INT_MIN; // 整数最小値 11 for(int i = 0; i < (int)v.size(); ++i) { 12 if( v[i] > maxVal ) 13 maxVal = v[i]; 14 } 15 return maxVal; 16} 17 18int solution(vector<int> &A){ 19 vector<int> track(max(A),0); 20 int Asize=A.size(); 21 22 for (int i=0;i<track.size();i++){ 23 track[A[i]-1]=1; 24 } 25 26 //Aと同じ要素数 27 int cnt=0; 28 while((track[cnt]==1) and (cnt < Asize)){ 29 cnt++; 30 } 31 32 if(cnt==Asize){ 33 return 1; 34 }else{ 35 return 0; //※この箇所まで、プログラムが動作することを確認しています。 36 } 37} 38 39int main(){ 40 vector<int> B={5,3,2,1};//こちらだとエラーになる 41 //vector<int> B={4,1,3,2,5};//こちらだとエラーにならない 42 cout << max(B) << endl; 43 cout << solution(B) << endl; 44 return 0; 45} 46

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/11/28 04:03

solutionのforループの条件がおかしいのでは。
ratera

2021/11/28 04:14

ご連絡ありがとうございます。 10分弱考えてみたのですが、ループ条件内のどのあたりがおかしいのかわかりませんでした。 お手数おかけしますが、補足いただけないでしょうか? よろしくおねがいします。 配列外を指し示すことはなさそうなことは確認していますが、その他の点なのでしょうか。
1T2R3M4

2021/11/28 04:17

>配列外を指し示すことはなさそうなこと 指し示すと思いますよ。
ratera

2021/11/28 04:42

ご指摘ありがとうございました。私の確認不足でした。 貴重なお時間いただきありがとうございます!
guest

回答2

0

ベストアンサー

Visual C++ で実行してみたところ赤枠の個所でエラーになっていました。
要素を超えてアクセスしているようです。

イメージ説明

イメージ説明

投稿2021/11/28 04:22

cx20

総合スコア4632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ratera

2021/11/28 04:28

あああああああ! やっと理解できました。ありがとうございます。 vscodeにいれた(gdb)Bash on windows lunchというデバッガでは止まらなかったため、気づきませんでした(?)配列外にアクセスした際にはコードが止まると思っておりましたが、そうではない場合もあるのかな。 お手数おかけして申し訳ございません。ありがとうございます。
guest

0

vectorの範囲外アクセスがあります。
g++を使っているなら、プログラムの先頭に以下のコードを追加したうえでデバッグしてみてください。

c++

1#define _GLIBCXX_DEBUG

投稿2021/11/28 04:21

actorbug

総合スコア2212

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ratera

2021/11/28 04:41

ありがとうございます! 該当のコードを利用すると、配列外を参照した場所でエラーを吐いてくれるようになりました。 以下も含めて、デバッグについて再確認しなおしたいと思います。自分で調べられるようになって嬉しいです。 https://aki33524.hatenablog.com/entry/2017/01/16/212526
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問