18725


c++の勉強を最近始めた者です。

返り値を2つ返したいと思いメンバ関数内でクラスポインタを宣言、newして  
それをそのまま返り値として使っていますが、deleteする場所がなくこういう場合  
にどうしたら良いのかをお聞きしたいです。  
クラスポインタを返り値の型として以下のような使い方をしています。  
例)  
■B.h

[code]

    class B
    {
      public:
       float num;
       float vt;
      public:
      void clear(){ num = vt = 0; }
    }
    
[/code]

■A.h  
'#'pragma once  
'#'include "B.h"

[code]

    class A
    {
     private:
       B* value;
     public:
       B* cul(float b);
       B* cul2(float c);
    };
    
[/code]

■A.cpp

'#'include "A.h"

[code]

     A::A()
    {
      value = new B;
    }
    
     A::~A()
    {
      delete value;
    }
    
     B* A::cul(float b)
    {
       // 引数を使って計算
        value->num = b * 2; 
        value->vt= b * 3;
    
        return value;
    }
    
    B* A::cul2(float c)
    {
        // 引数を使って計算
        value->num = c * 5; 
        value->vt = c / 3;
    
        return value;
    }
    
[/code]

というようなコードとなっています。ビルドもとおり、実行できるのですが  
exeを閉じようとすると次のようなエラーが出ます

Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

とでます。二重でdeleteしているという意味のようですが、デストラクタでしか  
deleteをしていないのに何故このようなエラーとなるのでしょうか？  
また、メンバ関数内でnewしてという方法も考えたのですが返り値として返したいので  
deleteする場所がなく実施できませんでした。  
c++について勉強中の身のため、質問の仕方が分かりにくくて  
申し訳ありませんがよろしくお願いいたします。


CC BY-SA 3.0
2015-11-12T07:39:54.160
18722
2015-11-12T08:58:35.427
2015-11-12T08:58:35.427
13237
13237
question
c++
メモリの二重解放について


挙げられたソースコードが構文上も、メンバー名も間違っていますが、少なくとも二重deleteは行っていません。実際のコードに問題があるか、もしくは挙げられていない呼び出し部分に問題があるはずです。

* * *

ちなみに

[code]

    B A::cul(float b){
        return { b * 2, b * 3 };
    
        // 古いコンパイラーの場合は以下記述で
        B b;
        b.num = b * 2;
        b.vt = b * 3;
        return b;
    }
    
[/code]

とポインターでなく`B`自身を返してはどうでしょうか？ `new`しない以上、`delete`は不要になります。


CC BY-SA 3.0
2015-11-12T08:06:18.757
18725
2015-11-12T08:06:18.757
4236
18722
answer