c语言,free总是提示触发了断点,求指导。

引入了自定义的头文件BiTree.h

 typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild, *rchild;

}BiTNode, *BiTree;

下面是cpp文件:

 #include "BiTree.h"
#include "stdlib.h"
#include "stdio.h"


bool Delete(BiTree &p)
{
    BiTree q = (BiTree)malloc(sizeof(BiTree));
    q = p;
    p = p->lchild;
    free(q);
    return true;
}



bool DeleteBST(BiTree &T, int key)
{
    if (!T)return false;
    else if (key==T->data)
    {
        return Delete(T);
    }
    else if (key < T->data)
    {
        return DeleteBST(T->lchild, key);
    }
}

int main()
{
    BiTree t1 = (BiTree)malloc(sizeof(BiTree));
    BiTree t2 = (BiTree)malloc(sizeof(BiTree));
    BiTree t3 = (BiTree)malloc(sizeof(BiTree));
    t1->data = 3;
    t2->data = 2;
    t3->data = 1;
    t1->lchild = t2;
    t1->rchild = NULL;
    t2->lchild = t3;
    t2->rchild = NULL;
    DeleteBST(t1, 2);

    printf("%d\n", t1->lchild->data);

    system("PAUSE");


    return 0;

}

运行时报错

图片说明

求指教。另外像多问一句,这里的函数,我这里形参前加了取地址符,我觉得其逻辑上是有问题的(我是认为书上的有问题于是仿照其写出来的这样一个程序),按这样的程序运行free后第一个结点的lchild应该就会空了。请大神指教指教

3个回答

错误在于Delete里的free(q);这句引起的,之所以释放出错,是由于你越界写入了,导致堆被破坏
根本原因在于malloc的时候申请的空间太小,(BiTree)malloc(sizeof(BiTree));中的BiTree是个指针,所以你只申请了4个字节的空间
应该改成(BiTree)malloc(sizeof(BiTNode));

  #include "BiTree.h"
#include "stdlib.h"
#include "stdio.h"


bool Delete(BiTree &p)
{
    BiTree q = (BiTree)malloc(sizeof(BiTNode));
    q = p;
    p = p->lchild;
    free(q);
    return true;
}



bool DeleteBST(BiTree &T, int key)
{
    if (!T)return false;
    else if (key==T->data)
    {
        return Delete(T);
    }
    else if (key < T->data)
    {
        return DeleteBST(T->lchild, key);
    }
}

int main()
{
    BiTree t1 = (BiTree)malloc(sizeof(BiTNode));
    BiTree t2 = (BiTree)malloc(sizeof(BiTNode));
    BiTree t3 = (BiTree)malloc(sizeof(BiTNode));
    t1->data = 3;
    t2->data = 2;
    t3->data = 1;
    t1->lchild = t2;
    t1->rchild = NULL;
    t2->lchild = t3;
    t2->rchild = NULL;
    DeleteBST(t1, 2);

    printf("%d\n", t1->lchild->data);

    system("PAUSE");


    return 0;

}

图片说明

补充一句,我认为free后第一个结点的lchild为空,而并非指向第三个结点,于是整棵二叉排序树出现问题(当然我这个是二叉排序树的超级简化版,只为了验证删除只有左子树而没有右子树的结点)。我是认为书上的这样的写法是有问题的,严蔚敏的数据结构c语言第2版算法9.7,二叉排序树删除结点。大家有什么高见呢

补充一句,我认为free后第一个结点的lchild为空,而并非指向第三个结点,于是整棵二叉排序树出现问题(当然我这个是二叉排序树的超级简化版,只为了验证删除只有左子树而没有右子树的结点)。我是认为书上的这样的写法是有问题的,严蔚敏的数据结构c语言第2版算法9.7,二叉排序树删除结点。大家有什么高见呢

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于c语言 fopen触发断点问题,求大神解惑

数据结构作业要构造huffman树并输出文件,但是过程遇到问题,困了好几天没能解决。 ![图片说明](https://img-ask.csdn.net/upload/201910/15/1571149416_706766.png)![图片说明](https://img-ask.csdn.net/upload/201910/15/1571149429_15842.png) 如图,我尝过许多方法,文件名字符串双斜杠试过,作为变量传入也试过,但是都会发生这样的情况。但是更让我难以理解的是偶尔会成功打开并且成功写入,这就让我不知道要从哪里找问题了。 部分代码如下,程序还未完成但是可以调试部分功能了 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define ERROR 0 #define OK 1 typedef int status; typedef struct { unsigned int weight; unsigned parent, lchild, rchild; }HTNode, *HuffmanTree; typedef char **HuffmanCode; void Get_Info(int *n, char **charset, int **w) { printf("请输入字符集大小:"); scanf("%d", n); getchar(); int i, m = 2 * (*n) - 1; *charset = (char*)malloc((*n) * sizeof(char)); *w = (int*)malloc((*n) * sizeof(int)); for (i = 0; i < *n; i++) { printf("请输入第%d个字符及其权值(中间用空格隔开):", i + 1); scanf("%c", (*charset)+i); getchar(); scanf("%d", (*w)+i); getchar(); } } void Select(HuffmanTree HT, int m, int *s1, int *s2) { //s1.w<s2.w int i, temp, tag = 1; HuffmanTree p; for (i = 1, p = HT + 1; i <= m; p++, i++) { if (p->parent == 0 && tag == 1) { *s1 = i; tag++; } else if (p->parent == 0 && tag == 2) { //没加else,导致同时执行 *s2 = i; break; } } if (HT[*s1].weight > HT[*s2].weight) { temp = *s1; *s1 = *s2; *s2 = temp; } for (i = 1, p = HT + 1; i <= m; p++, i++) { if (p->weight < HT[*s1].weight && p->parent == 0) { *s2 = *s1; *s1 = i; } else if (p->weight < HT[*s2].weight && p->weight != HT[*s1].weight && p->parent == 0) *s2 = i; } } void CreateHT(HuffmanTree *HT, int n, char *charset, int* w, char treefilename[]) { int i, m; int s1, s2; FILE *Huffman; HuffmanTree p; //初始化 m = 2 * n - 1; (*HT) = (HuffmanTree)malloc((m + 1) * sizeof(HuffmanCode)); for (p = *HT + 1, i = 1; i <= m; i++, p++) { p->weight = 0; p->parent = 0; p->lchild = 0; p->rchild = 0; } for (p = *HT + 1, i = 1; i <= n; i++, p++, w++) p->weight = *w; //建Huffman树 for (i = n + 1; i <= m; i++) { //调试分析1:写成i = 1,发生错误。 Select(*HT, i - 1, &s1, &s2); /*调试分析3:刚开始设置为i,导致select函数多找一位,Huffman树生成错误,应为i-1*/ (*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight; (*HT)[i].lchild = s1; (*HT)[i].rchild = s2; (*HT)[s1].parent = i; (*HT)[s2].parent = i; } //输出到Huffman文件 Huffman = fopen(treefilename, "w"); fprintf(Huffman, "W P L R\n"); for (i = 1; i <= m; i++) fprintf(Huffman, "%d %d %d %d\n", (*HT)[i].weight, (*HT)[i].parent, (*HT)[i].lchild, (*HT)[i].rchild); fclose(Huffman); } void Coding(HuffmanTree HT,HuffmanCode *HC, int n) { int start; unsigned int c, f; char *cd; (*HC) = (HuffmanCode)malloc((n + 1) * sizeof(char*)); cd = (char*)malloc(n * sizeof(char)); cd[n - 1] = '\0'; for (int i = 1; i <= n; ++i) { start = n - 1; for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent) { if (HT[f].lchild == c) cd[--start] = '0'; else cd[--start] = '1'; } (*HC)[i] = (char*)malloc((n - start) * sizeof(char)); strcpy((*HC)[i], &cd[start]); } free(cd); } status CodeFile(HuffmanCode HC, char *textfilename, char *codefilename, char *charset) { FILE *CodeFile, *TextFile; char text[1000],code[5000]; int length = 0, i, j; TextFile = fopen(textfilename, "r"); if (TextFile == NULL) { printf("正文文件不存在。请重试\n"); return ERROR; } while ((text[length] = fgetc(TextFile)) != EOF) length++; fclose(TextFile); CodeFile = fopen(codefilename, "w"); for (i = 0; i < length; i++) { j = 0; while (charset[j] != text[i]) j++; j++; fputs(HC[j], CodeFile); } fclose(CodeFile); return OK; } status Get_HT(HuffmanTree *HT, char *treefilename, int *n) { int status; char garbage[100]; FILE *Huffman; HuffmanTree p ,q; (*n) = 0; p = (HuffmanTree)malloc(sizeof(HuffmanCode)*2); Huffman = fopen(treefilename, "r"); if (Huffman == NULL) { printf("文件不存在!"); status = ERROR; } else { (*HT) = (HuffmanTree)malloc(sizeof(HTNode)); for (int i = 0; i < 100;i++) { fgets(garbage, 37, Huffman); puts(garbage); printf("*%d*", i); } while ((fscanf(Huffman ,"%d %d %d %d", &(p[*n+1].weight), &(p[*n + 1].parent), &(p[*n + 1].lchild), &(p[*n + 1].rchild)))!=EOF) {//eof标识文件输入结束 (*n)++; printf("%d %d %d %d\n", p[*n + 1].weight, p[*n + 1].parent, p[*n + 1].lchild, p[*n + 1].rchild); p = (HuffmanTree)realloc(p, sizeof(HuffmanCode)*(*n + 2)); } (*HT) = p; status = OK; } return status; } int main() { char *charset, treefilename[40], codefilename[40], textfilename[40], c; int i, n, *w, status; int op; HuffmanTree HT = NULL; HuffmanCode HC = NULL; printf("姓名:陈志涛 学号:2018051234 时间:2019/10/10\n"); printf("=======================Huffman编码=======================\n"); printf("操作说明:请输入操作序号,并根据提示输入\n"); printf("菜 单:1、构建Huffman树\n"); printf(" 2、编码\n"); printf(" 3、译码\n"); printf(" 4、退出程序\n"); do { printf("\n>>>请输入操作序号:"); scanf("%d", &op); getchar(); switch (op){ case 1: Get_Info(&n, &charset, &w); printf("请输入Huffman树的文件存储地址:"); gets_s(treefilename); CreateHT(&HT, n, charset, w, treefilename); printf("Huffman树构建并保存成功。\n"); break; case 2: if (HT == NULL) { printf("当前未构建Huffman树,是否从文件中读取(Y/N)?"); scanf("%c", &c); getchar(); if (c == 'Y' || c == 'y') { printf("请输入Huffman文件存储地址:"); gets_s(treefilename); status = Get_HT(&HT, treefilename, &n); if (status == ERROR) { printf("获取Huffman树失败,请检查。"); break; } } else break; } Coding(HT, &HC, n); printf("请输入正文文件的存储地址:"); gets_s(textfilename); printf("请输入Huffman编码的目标存储地址:"); gets_s(codefilename); CodeFile(HC, textfilename, codefilename, charset); break; } printf("\n"); } while (1); system("pause"); return 0; } ``` 希望有好心人帮帮忙解惑

c语言链栈运行时触发断点求解求解

#include<stdio.h> #include<stdlib.h> #define P1 #ifdef P1 typedef struct { char name[50]; int age; }DataType; typedef struct stacknode { DataType data; struct stacknode *next; }StackNode; typedef struct { StackNode *top; }LinkStack; StackNode *StackInit(void) { StackNode *p; if (p = ((StackNode *)malloc(sizeof(StackNode)))) { p->next = NULL; return p; } return NULL; } void InitStack(LinkStack *s) { s->top = NULL; } int StackEmpty(LinkStack *s) { return s->top == NULL; } void Push(LinkStack *s, DataType x) { StackNode *p = (StackNode *)malloc(sizeof(StackNode)); InitStack(s); p -> data = x; p->next = s->top; s->top = p; } DataType Pop(LinkStack *s) { DataType x; StackNode *p = s; if (StackEmpty(s)) { printf("stack underflow"); } x = p->data; s->top = p->next; free(p); return x; } DataType StackTop(LinkStack *s) { if (StackEmpty(s)) { printf("stack is empty"); } return s->top->data; } int main(void) { StackNode *stack; DataType data, data1; stack = StackInit(); printf("接下来进行入栈操作!\n"); printf("按照 姓名 年龄依次输入信息: "); scanf("%s%d", data.name, &data.age); Push(stack, data); printf("按照 姓名 年龄依次输入信息: "); scanf("%s%d", data.name, &data.age); Push(stack, data); printf("接下来进行出栈操作!\n"); data1 = Pop(stack); printf("出栈操作的数据是(%s,%d)\n", data1.name, data1.age); data1 = Pop(stack); printf("出栈操作的数据是(%s,%d)\n", data1.name, data1.age); system("pause"); return 0; } #endif

关于c语言中free以及指针的问题

先上代码 ``` #include <stdio.h> #include <string.h> #include <stdlib.h> struct ListNode { int val; struct ListNode *next; }; int main() { struct ListNode *ptr = (struct ListNode*)malloc(sizeof(struct ListNode)); ptr->val = 2; ptr->next = NULL; struct ListNode *qtr = (struct ListNode*)malloc(sizeof(struct ListNode)); qtr->val = 8; qtr->next = NULL; ptr->next = qtr; free(qtr);//对该句进行修改 while(ptr) { printf(" %d\n",ptr->val); ptr = ptr->next; } } ``` 1、输出错误,这里的原因如下,执行free后qtr并不是NULL;     free(pointer); 释放的是指针指向的内存。注意,释放的是内存,不是指针。指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不过现在指针指向的内容是垃圾,是未定义的。因此,释放内存后把指针指向 NULL,防止指针在后面不小心又被解引用了。 --------------------- 作者:ForeverStrong 来源:CSDN 原文:https://blog.csdn.net/chengyq116/article/details/79079389 版权声明:本文为博主原创文章,转载请附上博文链接! 2、将free(qtr);后面再添加qtr = NULL; 执行错误。 3、将free(qtr)改成qtr = NULL; 执行正确。 我想问的就是造成2、3的区别,在2中,free后,qtr与原来的链表已经没有联系了吗?个人推测,ptr->next在1里面指向依然是qtr,而qtr指向的是一个垃圾空间。在2里面,改变了qtr的值后,ptr->next为什么没有指向NULL? 感激不尽。

C语言free问题,出现运行时错误CRT

代码如下: ``` # include<stdio.h> # include <stdlib.h> # include <string.h> typedef struct node { char name[20]; struct node * next; }ListNode; typedef ListNode * LinkList; LinkList InitRing(int totalNumberOfPeople, LinkList linklist) { ListNode *footer, *slider;//*footer是表尾,*slider是游标 char name[20]; int i; footer = NULL; linklist = slider = (ListNode *)malloc(sizeof(ListNode)); if (linklist == NULL) { printf("内存分配错误。"); exit(1); } getchar(); for (i = 1;i < totalNumberOfPeople;i++) { printf("第%d个人的名字\n", i); scanf("%s",name); strcpy(slider->name, name); footer = (ListNode *)malloc(sizeof(LinkList)); if (footer == NULL) { printf("内存分配错误"); exit(1); } slider->next = footer; slider = footer; } printf("第%d个人的名字\n", i); scanf("%s",name); strcpy(footer->name, name); footer->next = linklist; printf("\n"); return linklist; } LinkList DeleteDeath(int totalNumberOfPeople, int countOffLimits, LinkList linklist) { int i, j; ListNode *slider, *deletePeople; slider = linklist; for (i = 1;i <= totalNumberOfPeople / 2;i++) { for (j = 1;j <= countOffLimits-2;j++) slider = slider->next; deletePeople = slider->next; slider->next = deletePeople->next; slider = slider->next; printf("%s ", deletePeople->name); if (i % 5 == 0) printf("\n"); free(deletePeople); } printf("\n"); return linklist; } void OutRing(LinkList linklist) { LinkList slider; int i = 1; slider = linklist; do { printf("%s ", slider->name); if (i % 5 == 0) printf("\n"); i++; slider = slider->next; } while (slider != linklist); } int main() { int totalNumberOfPeople, countOffLimits; LinkList linklist = NULL; printf("请输入总人数:\n"); scanf("%d", &totalNumberOfPeople); printf("请输入报数上限:\n"); scanf("%d", &countOffLimits); linklist = InitRing(totalNumberOfPeople, linklist);//建立循环单链链表函数 printf("出局名单如下:\n"); linklist = DeleteDeath(totalNumberOfPeople, countOffLimits, linklist); printf("\n"); printf("生存者名单如下:\n"); OutRing(linklist); return 0; } ``` # 发生运行时错误,提示CRT detected that the application wrote to memory after end of heap buffer 只要把DeleteDeath函数的free(deletePeople)删除即可。请问怎么这是什么问题,需要怎么修改?

C语言中Free函数释放内存为何释放不了!!!!!!!

#include <stdafx.h> #include<string> void testFree(char *par) { void*free(par); par = NULL; } int _tmain(int argc, _TCHAR* argv[]) { char path[10] = {"abc"}; char *str = (char *) malloc(100 *sizeof(char)); memset(str,0x00,100 *sizeof(char)); memcpy(str,path,strlen(path)); printf("wwl1:%s\n",str); testFree(str); printf("wwl2:%s\n",str); return 0; } 打印结果为: wwl1:abc wwl2:abc 正常的话不是应该为:wwl1:abc wwl2:(null) d 的么?为何输出有误,为何str内存并未释放?testFree函数地址传递有误么?

关于C语言中free()函数参数的问题

使用malloc分配一段内存后,使用free函数释放内存时 1. 若free的参数是这段内存的首地址,则是销毁这一整段内存吗? 2. 若free的参数是这段内存中的某一块内存的地址,则是只销毁这个地址所对应的这一小块地址吗?

C语言断点调试VC6.0有没有大神帮忙看下

这个是什么意思?还有每次黄色箭头指向的是有错的吗?![图片](https://img-ask.csdn.net/upload/201705/18/1495117961_6444.jpg)

牛顿迭代法求根C语言实现,求大神指导?

![图片说明](https://img-ask.csdn.net/upload/201810/01/1538357246_185341.png)

c语言 求个导数 怎么也做不对 求帮助

Description 给定函数:y = ( 1 + x2 )x。 针对输入变量x的取值,计算y'(y的导函数)的值。 Input 输入的第一个为整数N,后接N个变量x的取值。 Output 对每个输入的x值,每行输出一个y'的值,保留2位有效数字。 Sample Input 2 1 0.6 Sample Output 3.39 1.01 HINT 先求导数吧,然后把x代入y'。

C语言统计之众数,新手求大神指教,多谢!

求一组数据的众数。 众数指一组数据中出现次数最多的那些数。 input 每行代表一组数据,第一个整数n表示本组数据的个数,接下来的n个double数是数据,最后一行的0表示结束 output 整数输出众数的个数,保留两位小数输出众数(按升序排列空格分割), 再输出众数的次数,见样例。注意两个小 数差的绝对值小于1e-6即为相等,见样例 sample input 3 2 2 2 8 1.0 2.0 3.0 1.0 2.0 3.0 4.0 5.0 0 sample output 1 2.00 3 3 1.00 2.00 3.00 2 求大神指教!

C语言中malloc和free的问题

int *intPointer = (int *)malloc(3 * sizeof(int)); intPointer[0] = 1; intPointer[1] = 2; intPointer[2] = 3; printf("before free :%ld\n",intPointer); free(intPointer); printf("after free :%ld\n",intPointer); printf("%d\t%d\t%d\n",intPointer[0],intPointer[1],intPointer[2]); 输出结果: before free :4296037472 after free :4296037472 1 2 3 疑问:free(intPointer)之后,为什么还能通过intPointer访问malloc分配的那片内存?

C语言中如何调试函数求指导

C语言中如何调试函数?按F11几步之后进入了如下图一些文件中开始逐步调试,这是怎么回事? 就是一些诸如printf.c, _file.c的文件,怎么能跳过这些,调试函数呢?

C语言中指针释放问题,函数free()的使用。

各位大虾们,C语言中如果不是指向使用malloc,realloc、calloc动态申请的内存的指针,是不是就不需要free()释放该指针了呢? 比如说申请了一个指向结构体的指针, 或者是指向一个整型变量的指针。谢谢各位大虾。

c语言学习基础差,求指导

用结构体表示日期,输入一个日期(年、月、日),计算从输入年的1月1日到输入的日期的总天数days并输出。

如何用C语言实现求给定矩阵的逆矩阵?

C语言初学者,如何用不太高级的代码求给定矩阵的逆矩阵? ![图片说明](https://img-ask.csdn.net/upload/201901/02/1546432790_368340.jpg) 目前学完了《C语言程序设计现代方法(第2版)》(人民邮电出版社) 最好能有完整的程序,我完全想看懂,谢谢! 如果能用图形界面显示而不是用控制台,那就真的太感谢了!!!当然如果只能用控制台也行!

求c语言二分法求方程的根的具体算法

求c语言二分法求方程的根的具体算法===本人初学者,求大侠给出每步算法步骤,谢谢

C语言怎么用递归求组合数

求大神指导啊,递归基本思想了解,但是不知道怎么去表达,要求用公式C(n,r)=C(n,r-1)*(n-r+1)/r

C语言用递归求圆周率的值,怎么实现

C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环

c语言简单输出问题,求指导

#include <stdio.h> #include <stdlib.h> main () { int a=6,b=7; printf("%d,%d\n",a,b); { int b=10; printf("%d,%d\n",a,b); } printf("%d,%d\n",a,b); } 输出结果是:6,7 6,10 6,7 我不明白为什么打三个输出是6,7 求指导,自学c语言,没有老师问

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Linux面试题(2020最新版)

文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的进程间通信方式?Linux 有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...

将一个接口响应时间从2s优化到 200ms以内的一个案例

一、背景 在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧… 本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。 二、步骤 2.1 定位 定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。 2.1.1 工具监控 就工具而言,推荐使用 arthas ,用到的是 trace 命令 具体安装步骤很简单,大家自行研究。 我的使用步骤是...

学历低,无法胜任工作,大佬告诉你应该怎么做

微信上收到一位读者小涛的留言,大致的意思是自己只有高中学历,经过培训后找到了一份工作,但很难胜任,考虑要不要辞职找一份他能力可以胜任的实习工作。下面是他留言的一部分内容: 二哥,我是 2016 年高中毕业的,考上了大学但没去成,主要是因为当时家里经济条件不太允许。 打工了三年后想学一门技术,就去培训了。培训的学校比较垃圾,现在非常后悔没去正规一点的机构培训。 去年 11 月份来北京找到了一份工...

JVM内存结构和Java内存模型别再傻傻分不清了

JVM内存结构和Java内存模型都是面试的热点问题,名字看感觉都差不多,网上有些博客也都把这两个概念混着用,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关,本文针对这两个总是被混用的概念展开讲解。 JVM内存结构 JVM构成 说到JVM内存结构,就不会只是说内存结构的5个分区,而是会延展到整个JVM相关的问题,所以先了解下

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Google 与微软的浏览器之争

浏览器再现“神仙打架”。整理 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)从 IE 到 Chrome,再从 Chrome 到 Edge,微软与...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

85后蒋凡:28岁实现财务自由、34岁成为阿里万亿电商帝国双掌门,他的人生底层逻辑是什么?...

蒋凡是何许人也? 2017年12月27日,在入职4年时间里,蒋凡开挂般坐上了淘宝总裁位置。 为此,时任阿里CEO张勇在任命书中力赞: 蒋凡加入阿里,始终保持创业者的冲劲,有敏锐的...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

什么时候跳槽,为什么离职,你想好了么?

都是出来打工的,多为自己着想

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

立即提问
相关内容推荐