最初の場所へのポインターを渡すことによって、配列が関数に渡されるコードに取り組んでいます。関数では、配列の一部が使用されます。呼び出し元の関数が配列の最大サイズを正しく推測しない場合、呼び出し先の関数が配列サイズを超えて書き込み、スタック オーバーフローが発生する可能性があるため、これは危険な状況を生み出します。これに対する解決策を考えていたので、この例に示すように、関数テンプレートを使用して配列を参照として渡すことを考えました。
変更配列.h
#define MAXSIZE 10
class modifyArray
{
public:
void create();
void unsafeFunction(double*);
template<int N>
void safeFunction(double (&array)[N] );
private:
int computeLength();
};
変更配列.cpp
#include <iostream>
#include "modifyArray.h"
int modifyArray::computeLength()
{
return 11;
}
void modifyArray::create()
{
double testarray[MAXSIZE];
unsafeFunction(testarray);
safeFunction(testarray);
}
void modifyArray::unsafeFunction(double* array)
{
int operatingSize = computeLength();
for(int i = 0; i < operatingSize; i++) {
array[i] = i*i;
}
}
template<int N>
void modifyArray::safeFunction(double (&array)[N] )
{
int operatingSize = computeLength();
std::cout<< "Max size" << N <<std::endl;
if(operatingSize > N) return; // Return or raise an exception
for(int i = 0; i < operatingSize; i++) {
array[i] = i*i;
}
}
main.cpp
#include "modifyArray.h"
int main(int argc, const char * argv[]) {
modifyArray C;
C.create();
return 0;
}
既存のコードへの侵襲を最小限に抑えるソリューションを探しています。ここでは、テンプレート ステートメントを追加し、引数を double* から参照に変更し、if ステートメントを挿入してサイズを確認するだけです。大幅な書き直しはしたくありません。また、主にパフォーマンス上の理由から、動的割り当て、ベクトル、または std::array を使用したくありません。これは、数値シミュレーション コードの低レベル関数であり、パフォーマンスが非常に重要です。より良い解決策はありますか?私がしていることに落とし穴はありますか?