这是我认为可能导致此错误的简化程序.
char *p = (char*)malloc(8192);
for(int i = 0; i < 9200; ++i){
p[i] = '1';
}
char *s = (char*)malloc(strlen(p));
Run Code Online (Sandbox Code Playgroud)
原始项目相当复杂,所以我简化了它.我使用malloc分配了8192个字节.然后我的程序将超过8192个字符写入数组.然后我将使用malloc分配内存.
这个迷你程序没有崩溃.但在最初的大项目中,它崩溃了这个错误:
malloc():内存损坏:0x0000000007d20bd0***
什么可能导致这种差异?
我正在使用vs2013(Win32)测试以下程序:
#include <iostream>
class A {
virtual void funA();
};
class B {
virtual void funB();
};
class C :public A{
int i;
virtual void funC();
};
class D :public B, C{
virtual void funD();
};
int main(){
std::cout << "size A " << sizeof(A) << std::endl;
std::cout << "size B " << sizeof(B) << std::endl;
std::cout << "size C " << sizeof(C) << std::endl;
std::cout << "size D " << sizeof(D) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是
尺寸A 4 …
我需要维护一些其他人编写的代码.我只是遇到了在一个函数内声明并在别处定义的许多函数.例如:
int func(){
...
extern func1();
extern func2();
...
}
Run Code Online (Sandbox Code Playgroud)
他们为什么声明和定义这样的函数?为什么他们不在外面声明函数?有什么好处?
这是我的代码:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
pthread_t ntid;void
printids(const char *s) {
printf("%s \n", s);
}
void *
thr_fn(void *arg) {
printids("new thread: ");
return((void *)0);
}
int
main(void) {
pthread_create(&ntid, NULL, thr_fn, NULL);
printids("main thread:");
}
Run Code Online (Sandbox Code Playgroud)
我在 Red Hat Enterprise Linux Workstation 版本 6.5 上运行它。
这是我的编译命令
gcc -ansi -g -std=c99 -Wall -DLINUX -D_GNU_SOURCE threadid.c -o threadid -pthread -lrt -lbsd
这是输出:
主线程:
新线程:
新线程:
为什么“新线程”已打印两次?我怀疑这可能与 Linux 中的缓冲机制有关。但是在我添加fflush(stdout)和fsync(1)在每个函数的末尾之后。输出几乎相同。
如果您多次运行该程序。输出不同:
主线程:
新线程:
或者
主线程:
新线程: …
我有一个基类和许多派生类。
派生类的构造函数都需要调用reset()具有相同签名的函数。结果,我想virtual void reset() = 0在基类中将纯虚函数声明为Interface。
但是,问题是:
不应在Constructor中调用虚函数。
但是我想reset()成为基类提供的接口。这样所有派生类都必须分别实现reset。
我该怎么办?
在Scott Meyers的"Effective C++"中第26项:尽可能推迟变量定义,赋值的成本肯定不会低于构造函数 - 析构函数对.
然后,对于不同的数据类型或类,如何将赋值的成本与构造函数 - 析构函数对进行比较?哪一个会更便宜?为什么?
在我看来,构造函数 - 析构函数对需要分配和释放内存,而构造函数至少会初始化变量.但是赋值只需要改变变量的值.
所以,我认为一般来说,赋值的成本应该小于构造函数 - 析构函数对.
我是Shell的新手。而且我)用的使用(糊涂一点点,[],{}像shell脚本$(),[ [] ],${}等等。我想对它们的用法进行分类,以更有效地学习shell脚本。
c ×4
c++ ×4
linux ×3
constructor ×2
bash ×1
buffering ×1
destructor ×1
extern ×1
function ×1
inheritance ×1
pure-virtual ×1
shell ×1