如何使用new声明二维数组?
就像,对于"普通"数组,我会:
int* ary = new int[Size]
Run Code Online (Sandbox Code Playgroud)
但
int** ary = new int[sizeY][sizeX]
Run Code Online (Sandbox Code Playgroud)
a)不工作/编译和b)没有完成什么:
int ary[sizeY][sizeX]
Run Code Online (Sandbox Code Playgroud)
确实.
今天我用一些C代码帮助我的一个朋友,我发现了一些奇怪的行为,我无法解释他为什么会发生这种行为.我们有一个带有整数列表的TSV文件,每行都有一个int.第一行是列表的行数.
我们还有一个非常简单的"readfile"的ac文件.第一行读到n,行数,然后有一个初始化:
int list[n]
Run Code Online (Sandbox Code Playgroud)
最后是一个带有fscanf的n循环.
对于小n(直到~100,000),一切都很好.但是,我们发现当n很大(10 ^ 6)时,会发生段错误.
最后,我们将列表初始化更改为
int *list = malloc(n*sizeof(int))
Run Code Online (Sandbox Code Playgroud)
一切都很好,即使是非常大的n.
有人能解释为什么会这样吗?什么导致了segfault [n]的段错误,当我们开始使用list = malloc(n*sizeof(int))时停止了?
以下代码为我生成堆栈溢出错误
int main(int argc, char* argv[])
{
int sieve[2000000];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我正在使用Turbo C++,但我想将我的代码保存在C中
编辑:
感谢您的建议.上面的代码只是例如,我实际上在函数中声明了数组而不是在sub main中.此外,我需要将数组初始化为零,所以当我使用Google搜索时,我发现calloc非常适合我的目的.
Malloc/calloc还具有优于堆栈分配的优势,允许我使用变量声明大小.
我不知道在这里想些什么......
我们有一个作为服务运行的组件.它在我的本地机器上运行得非常好,但是在其他一些机器上(两台机器RAM都等于2GB),它会在第二天和连续几天开始生成bad_alloc异常.问题是该过程的内存使用量保持不变,大约为50Mb级别.另一个奇怪的事情是,通过跟踪消息,我们已经定义了从stringstream对象抛出的异常,该对象只会向流中插入不超过1-2 Kb的数据.如果重要的话,我们正在使用STL-Port.
现在,当你得到一个bad_alloc异常时,你认为这是一个内存泄漏.但是我们所有的手动分配都包含在一个智能指针中.此外,当整个过程仅使用~50Mb(内存使用量每天保持不变(并且肯定不会上升))时,我无法理解stringstream对象如何缺少内存.
我无法为您提供代码,因为项目非常大,抛出异常的部分除了创建字符串流和<<某些数据然后记录它之外别无其他功能.
所以,我的问题是......当进程只使用2GB的50Mb内存时,如何发生内存泄漏/ bad_alloc?还有什么其他的猜测可能是错的?
在此先感谢,我知道这个问题很模糊,我只是有点绝望,我尽力解释这个问题.
灵感来自这个问题.
显然在以下代码中:
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
if( GetTickCount() > 1 ) {
char buffer[500 * 1024];
SecureZeroMemory( buffer, sizeof( buffer ) );
} else {
char buffer[700 * 1024];
SecureZeroMemory( buffer, sizeof( buffer ) );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用Visual C++ 10进行编译时使用默认堆栈大小(1兆字节),并在(/ O2)上进行优化,因为程序试图在堆栈上分配1200千字节而发生堆栈溢出.
上面的代码当然有点夸大以显示问题 - 以相当愚蠢的方式使用大量堆栈.然而在实际场景中,堆栈大小可以更小(例如256千字节),并且可能有更多分支具有更小的对象,这将导致总分配大小足以溢出堆栈.
这是没有意义的.最糟糕的情况是700千字节 - 它将是构建一直具有最大总大小的局部变量集的代码路径.在编译期间检测该路径应该不是问题.
因此编译器会生成一个程序,尝试分配比最坏情况更多的内存.根据这个答案, LLVM也是如此.
这可能是编译器的一个缺陷,或者可能有一些真正的理由这样做.我的意思是也许我只是不明白编译器设计中的某些东西可以解释为什么以这种方式进行分配是必要的.
为什么编译器希望程序在最坏的情况下分配比代码需要更多的内存?
c++ stack-overflow compiler-construction memory-management visual-c++
我很好奇是否可以确定数组在C++中可以拥有的最大大小.
#include <iostream>
using namespace std;
#define MAX 2000000
int main()
{
long array[MAX];
cout << "Message" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个编译得很好,但是一旦我运行它就会出现段错误(即使实际上没有引用数组).我知道这也是数组大小,因为如果我将其更改为1000000它运行得很好.
那么,是否存在某种定义或某种方式#define MAX MAX_ALLOWED_ARRAY_SIZE_FOR_MY_MACHINE_DEFINED_SOMEWHERE_FOR_ME?
我实际上并不需要这个,这个问题是出于好奇的缘故.
假设需要一个固定大小的缓冲区,是否有大小限制或阈值,这样在大小限制下可以使用快速堆栈分配std::array,并且超过该限制最好使用std::vector从堆动态分配的内存(因为堆栈内存很珍贵,不应该消耗太多)?
// I think allocating 32 bytes on the stack is just fine.
std::array<BYTE, 32> smallBuffer;
// For 32KB, it's better getting memory from the heap.
std::vector<BYTE> bigBuffer(32*1024);
// Is it better to allocate a 1KB buffer on the stack (with std::array)
// or is it too much, and it's better to allocate on the heap (using std::vector)?
// What about 512 bytes? And 4KB?
// Is there a suggested size threshold?
std::array<BYTE, 1024> …Run Code Online (Sandbox Code Playgroud) 对于作业,我应该重新创建C++ Vector库,目前我仍然坚持如何返回最大大小.
根据这个网站:http: //www.cplusplus.com/reference/stl/vector/ size_type max_size()const; 返回最大尺寸
返回向量容器可容纳的最大元素数.
目前我的函数是基于数组的操作而矢量库不是基于模板类,矢量库使用int和size_t数据类型.(我不确定这是否与此有关)
相关代码:
class vector{
private:
int *vect;
size_t length;
size_t cap;
public:
//=====================Constructor================
vector(){
length = 0;
cap = 20;
vect = new int[20];
}
//INCOMPLETE
size_t max_size() const{
//return???!?!?!?!?
}
Run Code Online (Sandbox Code Playgroud)
}
使用MPI :: Isend的语法
MPI::Request MPI::Comm::Isend(const void *buf, int count,
const MPI::Datatype& datatype,
int dest, int tag) const;
Run Code Online (Sandbox Code Playgroud)
是受限制的数据量
std::numeric_limits<int>::max()
Run Code Online (Sandbox Code Playgroud)
许多其他MPI函数都有int参数.这是MPI的限制吗?
当使用C++向量时,花费的时间是718毫秒,而当我使用Array时,时间几乎是0毫秒.
为什么这么大的性能差异?
int _tmain(int argc, _TCHAR* argv[])
{
const int size = 10000;
clock_t start, end;
start = clock();
vector<int> v(size*size);
for(int i = 0; i < size; i++)
{
for(int j = 0; j < size; j++)
{
v[i*size+j] = 1;
}
}
end = clock();
cout<< (end - start)
<<" milliseconds."<<endl; // 718 milliseconds
int f = 0;
start = clock();
int arr[size*size];
for(int i = 0; i < size; i++)
{
for(int j = 0; j < …Run Code Online (Sandbox Code Playgroud) c++ ×8
arrays ×5
memory ×3
c ×2
stack ×2
vector ×2
allocation ×1
c++11 ×1
heap ×1
malloc ×1
max ×1
memory-leaks ×1
mpi ×1
size ×1
visual-c++ ×1
windows-xp ×1