はい、それぞれnew
にはdelete
があります。固定サイズの配列を扱っているので、delete[]
は正確に必要なものです。
また、RAIIの原則に従って、コンストラクタにnew
、デストラクタにdelete
を持たせるとよいでしょう。
検証するもう1つの方法は、プログラムのメモリリークをチェックすることです。例えばVisual Studioで、次を示していないメモリリーク:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
#include <string>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__)
#define new DBG_NEW
#endif
#endif // _DEBUG
struct TRANSITION {
int transition;
int next_state;
};
struct state {
int transitionCount = 0;
std::string stateName;
std::string stateAction;
TRANSITION transitions[50];
};
class FSM {
public:
FSM(int n);
~FSM();
int numberOfStates;
state* states;
int currentState;
int stateCount;
};
FSM::FSM(int n)
{
numberOfStates = n;
states = new state[numberOfStates];
currentState = 0; //First state numbered state 0
stateCount = 0;
}
FSM::~FSM() { delete[] states; };
//FSM::~FSM() { };
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
FSM fsm(3);
return 0;
}
しかし、あなたはdelete[] states;
文を削除した場合、それは生産:
Detected memory leaks!
Dumping objects ->
{160} normal block at 0x0000024535F03B00, 16 bytes long.
Data: < V 5E > D8 56 F0 35 45 02 00 00 00 00 00 00 00 00 00 00
{159} normal block at 0x0000024535F04730, 16 bytes long.
Data: < V 5E > B0 56 F0 35 45 02 00 00 00 00 00 00 00 00 00 00
{158} normal block at 0x0000024535F03A10, 16 bytes long.
Data: < T 5E > F0 54 F0 35 45 02 00 00 00 00 00 00 00 00 00 00
{157} normal block at 0x0000024535F03AB0, 16 bytes long.
Data: < T 5E > C8 54 F0 35 45 02 00 00 00 00 00 00 00 00 00 00
{156} normal block at 0x0000024535F03DD0, 16 bytes long.
Data: < S 5E > 08 53 F0 35 45 02 00 00 00 00 00 00 00 00 00 00
{155} normal block at 0x0000024535F046E0, 16 bytes long.
Data: < R 5E > E0 52 F0 35 45 02 00 00 00 00 00 00 00 00 00 00
c:\users\username\documents\visual studio 2015\projects\project60\project60\main.cpp(41) : {154} normal block at 0x0000024535F052D0, 1472 bytes long.
Data: < > 03 00 00 00 00 00 00 00 00 00 00 00 CD CD CD CD
Object dump complete.
すべてのnew
とdelete
を追跡するために注意が必要ですなぜなら、最良の方法は通常、プロトタイプstd::vector
のような標準ライブラリコンテナの1つを使用することです。
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
#include <string>
#include <memory>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__)
#define new DBG_NEW
#endif
#endif // _DEBUG
struct TRANSITION {
int transition;
int next_state;
};
struct state {
int transitionCount = 0;
std::string stateName;
std::string stateAction;
TRANSITION transitions[50];
};
class FSM {
public:
FSM(int n);
~FSM();
int numberOfStates;
//state* states;
std::unique_ptr<state[]> states;
int currentState;
int stateCount;
};
FSM::FSM(int n)
{
numberOfStates = n;
//states = new state[numberOfStates];
states = std::make_unique<state[]>(numberOfStates);
currentState = 0; //First state numbered state 0
stateCount = 0;
}
//FSM::~FSM() { delete[] states; };
FSM::~FSM() { };
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
FSM fsm(3);
return 0;
}
delete
を忘れるのリスクなしに、我々は、おそらくビットは、いずれかの任意のnew
文を見ていない、より安全を感じることができます。
もう一つ、おそらく軽い、修正は、std::unique_ptr
としてスマートポインタを使用することができます。
どのようなタイプが 'states'ですか?そしてなぜ単に 'std :: vector'や他の何かを使ってあなたのためにしないのですか? –
ここでは「静的」とは見えません。 –
"構造体のすべての要素は静的です"(1)このコードには静的メンバーはありません(2) 'std :: vector'を使用してください。 –