VS 内存不能read—堆栈空间解决栈溢出问题

在Visual Studio开发中遇到栈溢出问题,可以通过增大堆栈大小或使用动态分配内存解决。堆栈默认大小可能不足以处理大数组或对象。动态分配(new)可避免栈溢出,但需手动删除(delete)。也可通过/STACK链接器选项调整栈空间大小,例如设置为100MB。此外,还可以通过定义.def文件或在Project Settings中调整栈的reserve和commit值。
摘要由CSDN通过智能技术生成
最近给一个程序添加小功能,在debug下能正常运行,在release下就出现内存不能read,很是费解。但调试跟踪后找到程序出错的地方,问题出现在对话框创建的过程中ChannelcfgDlg.Create(IDD_SUB_DLG_CHAN_CFG,&m_settingTab);后来在网上搜索一些资料,发现程序的静态数据量大的时候,有时候会出现栈溢出问题,往往是程序还没运行算法呢,就down掉了,在反观程序中这个对话框类中确实定义了大量的数组。http://wuliang20080412.blog.163.com/blog/static/905220552010320018881/

比如你在创建包含大数组的类(或数据)的时候,栈就溢出了。这是由于系统分配给程序的栈空间太小。

一种方法,就是不要静态分配,用new动态创建,是从堆中分配的,堆的空间足够大,不过记得写析构函数,delete你申请的堆空间。其实这样也挺方便,类结束的时候会自动调用析构函数释放空间。养成"不在栈上定义大数组/大对象"的好习惯很重要,否则再大的栈也会被撑爆的。

当然,如果你不喜欢new,delete的话,还是静态分配(毕竟静态分配有很多好处),那么可以通过改变默认栈空间来解决。

 

LINK的/STACK选项  

对于Linux中的WiFi P2P链接,可以通过wpa_supplicant实现。下面是一个简单的示例代码,可以帮助你开始: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define BUFFER_SIZE 256 int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[BUFFER_SIZE]; if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[2]); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); exit(1); } server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) { perror("ERROR connecting"); exit(1); } while (1) { bzero(buffer, BUFFER_SIZE); printf("Please enter the message: "); fgets(buffer, BUFFER_SIZE, stdin); n = write(sockfd, buffer, strlen(buffer)); if (n < 0) { perror("ERROR writing to socket"); exit(1); } bzero(buffer, BUFFER_SIZE); n = read(sockfd, buffer, BUFFER_SIZE); if (n < 0) { perror("ERROR reading from socket"); exit(1); } printf("Server message: %s\n", buffer); } close(sockfd); return 0; } ``` 这个程序可以连接到一个指定的主机和端口,并在两者之间发送消息。你可以在Linux中使用wpa_supplicant来启用WiFi P2P,并在另一个设备上运行相同的程序。这样,你就可以在两个设备之间建立一个点对点的连接,并在它们之间传输数据了。 然而,堆栈内存溢出是一个常见的问题,可能会导致程序崩溃。为了避免这个问题,你可以使用动态内存分配,而不是使用堆栈。例如,你可以使用malloc()函数在堆上分配内存,而不是在栈上分配内存。这样,你就可以更好地控制你的内存使用情况,从而避免堆栈内存溢出
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值