Я работаю над кодом, в котором массив передается функции, передавая указатель на первое место. В функции используется часть массива. Это создает небезопасную ситуацию, потому что есть вероятность, что функция вызывающего абонента не угадает максимальный размер массива правильно, функция вызываемого абонента может записать за размер массива, и может произойти переполнение стека. Я думал о решении этого вопроса и думал об использовании шаблона функции и передаче массива в качестве ссылки, как показано в этом примере.Как избежать переполнения стека при передаче массива функции в C++?
modifyArray.h
#define MAXSIZE 10
class modifyArray
{
public:
void create();
void unsafeFunction(double*);
template<int N>
void safeFunction(double (&array)[N]);
private:
int computeLength();
};
modifyArray.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 в основном из-за причин производительности. Это низкоуровневая функция в коде численного моделирования, и производительность очень важна. Есть ли лучшее решение? Есть ли ловушка для того, чтобы делать то, что я делаю?
* [...] или станд :: массив в основном из соображений производительности *. «Std :: array» - это просто оболочка для массива и имеет ту же производительность во время выполнения, что и необработанный массив. – NathanOliver
Либо передайте другой параметр, указав количество элементов, либо просто используйте 'std :: array'. Производительность будет такой же. –
Также я не думаю, что вы описываете переполнение стека. Вы описываете исключение вне пределов. –