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

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

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

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

Q&A

解決済

3回答

1705閲覧

c++ ループの中と外で配列を定義する メモリ

ham33

総合スコア15

C++

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

0グッド

0クリップ

投稿2019/01/08 08:01

編集2019/01/08 08:14

前提・実現したいこと

ループの中とループの外で別々にカウントをしていき、
メモリを開放したい。

発生している問題・エラーメッセージ

現状、プログラムはできたものの、ループを1回だけ回すと正常に動きますが、
複数回回そうとするとエラーを吐きます。

*** Error in `./check': corrupted size vs. prev_size: 0x0000000000f89f30 ***

該当のソースコード

c++

1#define LOOP1 10 2#define LOOP2 15 3#define L 5 4int main(void){ 5int loop1,loop2=0; 6Complex *pn; 7 pn = new Complex [LOOP2]; 8Complex *in; 9 in = new Complex [L]; 10 11for(loop1=0;loop1<LOOP1;loop1++){ 12 13 for(loop2=0;loop2<LOOP2;loop2++){ 14 funcA(in, pn, L, loop2); 15 } 16} 17 18delete [] pn; 19delete [] in; 20 21return 0; 22}

c++

1void funcA(Complex *in, Complex *pn, int L, int loop2){ 2 int i; 3 //ここでpn配列の値を決める 4 for(i=0;i<L;i++){ 5 in[i] *= pn[loop2]; 6 } 7}

試したこと

ループ回数の変更、メモリ解放する位置、メモリ確保する位置の変更

補足情報(FW/ツールのバージョンなど)

わかりづらいものですいません。
長さLの配列inに対して、ループ2を回していき、長さ0〜L-1に対してpnを
かけます。pnはループ2を回すたびに、値が変わっていきます。
ex.
in[0] = in[0] * pn[0];
in[1] = in[1] * pn[0];
...
in[L-1] = in[L-1] * pn[0]; //ループ2の1回終了
in[0] = in[0] * pn[1];
...
in[L-1] = in[L-1] * pn[1]; //ループ2の2回目終了
...
...
in[0] = in[0] * pn[LOOP2-1];
...
in[L-1] = in[0] * pn[LOOP2-1]; //ループ2のすべて終了

ここまできたら、ループ1を1回追加して、再びループ2を回します。
配列pnはループ1を回すたびに書き換えず、一回回したらそれをループ2にかけていっても構わないのですが、わからなかったので、現状は、ループ1を回すたびに変更するようになっています。

配列inとpnの掛け算はできるだけメインとは別の関数で行いたく思っております。
メモリのエラーだとは承知しているのですが、なかなか直せなかったので助言等
いただければと思います。お願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

そもそも論new/deleteを使ってはいけません。そしてあなたが必要なのはおそらくstd::vectorです。
https://cpprefjp.github.io/reference/vector/vector.html

完全なコードが無いので、適当にリファクタリングしつつ書き換えたのが下です。Complexとかいう謎の型も知らんのでとりあえずstd::complex<float>のエイリアスにしています。newしているのは意味不明だったので単に配列にしています。

cpp

1constexpr int LOOP1 = 10; 2constexpr int LOOP2 = 15; 3constexpr int L = 5; 4#include <complex> 5#include <iostream> 6using Complex = std::complex<float>; 7void funcA(Complex *in, Complex *pn, int L, int loop2){ 8 //ここでpn配列の値を決める 9 for(int i=0;i<L;i++){ 10 in[i] *= pn[loop2]; 11 } 12} 13int main(void){ 14 Complex pn[LOOP2]; 15 Complex in[L]; 16 for(int loop1=0;loop1<LOOP1;loop1++){ 17 for(int loop2=0;loop2<LOOP2;loop2++){ 18 funcA(in, pn, L, loop2); 19 } 20 } 21 for(auto& p : pn) std::cout << p << std::endl; 22 for(auto& i : in) std::cout << i << std::endl; 23}

実行結果は

https://wandbox.org/permlink/iiE6kkG0dtJIGpqi

です。特に状況は再現できません。

ところで、pnが0のまま演算を進めても全部0のままでは?という思いです。

投稿2019/01/08 08:09

編集2019/01/08 15:14
yumetodo

総合スコア5850

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

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

ham33

2019/01/08 09:43

new/deleteを使っていけない理由とは何でしょうか。 教えていただけますと幸いです。
yumetodo

2019/01/08 10:53

スマートポインタとかRAIIとかで検索するとお望みの情報が得られるかと思われます。
ham33

2019/01/08 12:33

ありがとうございます。今後勉強させていただきます。 元々の私の質問に対しては、なにかお答えいただけますか?
ham33

2019/01/10 01:48

載せていただいたものを参考に書きなおしたところ無事解決いたしました。 元のコードがあまりにも長かったため、要点だけを載せようと思い。逆に理解不能な文を作ってしまい、ご迷惑おかけしました。
guest

0

pn = new Complex [loop2];

pnは要素0の配列になってますが

in = new Complex [L];

Lの定義はどうなってるでしょうか

投稿2019/01/08 08:07

編集2019/01/08 08:10
y_waiwai

総合スコア87774

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

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

ham33

2019/01/08 08:15 編集

すいません。pnは要素数LOOP2です。申し訳ございません。Lについても追加記載しました。 疑問点の本質がループを回す際のメモリの扱い?であったので、その他の点について記載が適当になってしまいました。
guest

0

pnnewする段階では、小文字のloop2は初期化しただけでゼロなので、pnは要素数ゼロとして確保しようとしてしまっています。

投稿2019/01/08 08:06

maisumakun

総合スコア145183

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

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

ham33

2019/01/08 08:12

すいません。pnは要素数LOOP2です。申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問