分配 const char* const 缓冲区时,C++ 应用程序崩溃
c++ application is crashing when allocating a const char* const buffer
我在 C++ 应用程序中创建缓冲区时遇到问题。我被迫创建一个 const char* const* 缓冲区,以便我可以使用 libpq 的 PQexecParams 函数。
PGresult *PQexecParams(PGconn *conn,
const char *command,
int nParams,
const Oid *paramTypes,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
这里是重现问题的一些代码,当我为缓冲区分配大于 2.5MB 的任何内容(例如 运行 程序并指定大小为 2621440 时,我得到 STATUS_STACK_OVERFLOW 异常.
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
cout << "Buffer size Testing" << endl;
cout << "==========================" << endl;
int size;
cout << "Size of buffer?" << endl;
cout << "Size: ";
cin >> size;
try {
const char * const *buffer[size];
} catch (...){
cout << "An error was encountered!" << endl;
exit(1);
}
return 0;
}
创建用于 PQexecParams 的大缓冲区 (2.5MB) 的正确方法是什么?
你的代码正在做的是在堆栈上分配一个大的指针数组,这就是你得到堆栈溢出异常的原因。
在堆上分配缓冲区的正确方法是:
char* buffer = new char[size]; // add consts where you need them
不过,我会听从@BoBTFish 的建议,只使用:
std::vector<char> buffer(size);
您可以通过 buffer.data()
或获取第一个元素的地址 &buffer[0]
来访问数据缓冲区。 Vector 将在其析构函数中释放分配的内存。
我在 C++ 应用程序中创建缓冲区时遇到问题。我被迫创建一个 const char* const* 缓冲区,以便我可以使用 libpq 的 PQexecParams 函数。
PGresult *PQexecParams(PGconn *conn,
const char *command,
int nParams,
const Oid *paramTypes,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
这里是重现问题的一些代码,当我为缓冲区分配大于 2.5MB 的任何内容(例如 运行 程序并指定大小为 2621440 时,我得到 STATUS_STACK_OVERFLOW 异常.
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
cout << "Buffer size Testing" << endl;
cout << "==========================" << endl;
int size;
cout << "Size of buffer?" << endl;
cout << "Size: ";
cin >> size;
try {
const char * const *buffer[size];
} catch (...){
cout << "An error was encountered!" << endl;
exit(1);
}
return 0;
}
创建用于 PQexecParams 的大缓冲区 (2.5MB) 的正确方法是什么?
你的代码正在做的是在堆栈上分配一个大的指针数组,这就是你得到堆栈溢出异常的原因。
在堆上分配缓冲区的正确方法是:
char* buffer = new char[size]; // add consts where you need them
不过,我会听从@BoBTFish 的建议,只使用:
std::vector<char> buffer(size);
您可以通过 buffer.data()
或获取第一个元素的地址 &buffer[0]
来访问数据缓冲区。 Vector 将在其析构函数中释放分配的内存。