Jan 8
昨天看的《C++标准函数库》,看到auto_ptr这一节,说到了关于内存泄露的问题
而且有些情况以前根本没有考虑到,想想觉得好危险。
典型的情况就是如下的代码:
void foo(){
  int *p = new int[10];
  //do sth.
  delete[] p;
}

如果在//do sth.的时候退出了函数,比如一个return语句,或者是抛出了一个异常
那么最后的delete p就不会被执行,于是就造成了内存的泄露。
更极端一点的情况是,可能申请了多个内存,有多处return,如果每一个都要处理,那程序就太恶心了。
但是不处理又是不行的——于是需要有一种方式来解决,于是标准库就引进了auto_ptr 智能指针。
这个东西保证它自己被销毁的时候能够释放其指向的对象(使用delete)。
一个简单的例子是:
#include<memory>  //auto_ptr在头文件memory里面哦
using namespace std::auto_ptr;  //它在namespace std里面哦

void foo(){
  std::auto_ptr<classA> p(new classA);
  //do sth.
  //no need to free p;
}

在退出函数foo()的时候,p的析构函数会被调用,自动释放它指向的classA,于是再也不用费神去写delete了,真好~

不过auto_ptr不是基于引用计数的智能指针,所以有一些很特殊的属性。
如果想要用它,一定一定要都了解了才用哦!就推荐看这本书《The C++ Standard Library》C++标准函数库。
Dec 29

Felix的网页代码高亮工具 不指定

felix021 @ 2008-12-29 22:47 [IT » 网络] 评论(0) , 引用(0) , 阅读(5242) | Via 本站原创
觉得blog的代码没有高亮非常难看,
但是不想用现成的超级臃肿的代码高亮工具,
于是自己写的一个,效果还行吧^_^
#include<iostream>
using namespace std;

int main(){
    int a, b;
    cin >> a >> b;
    cout << (a + b) << endl;
    return 0;
}

My Simple HighLighter  @ CopyLeft

By Felix021 ( http://www.felix021.com ) @ 2008.12.29

一个很简单的基于Javascript的C/C++/...语法高亮代码

用法:

1. 在<head>和</head>之间加上这两句:
    <link rel="stylesheet" rev="stylesheet" type="text/css" href="styles.css" />
    <script language="javascript" src="hl.js"></script>

2. 需要高亮的代码块,应该是div元素,并且class要设置为code,例如
    <div class="code">int main(){}</div>
    当然,你也可以改hl.js里面的getElementsByTagName("div")来修改元素类型
    修改后面的 if(clsname == "code") 也可以修改class的名字,但是记得也要修改styles.css

3. 在网页底部的</body>之前加上这个
    <script language="javascript> highlighter(); </script>

4. 可以修改styles.css自定义元素的样式表

5. 可以修改 hl.js 的keywords列表增加自己想要的关键字list
    var keywords = array(
        "int", "char", "bool", "class"
    );
    注意每一个关键字要用引号围起来,而且两个关键字之间要用逗号分开;
    最后一个关键字后面没有逗号。

例子参见index.html

下载文件 (已下载 1599 次)
Dec 29

return语句引起的栈错误 不指定

felix021 @ 2008-12-29 20:28 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(6266) | Via 本站原创
被牛逼哄哄的Snoopy雷到了。

事情是这样的,今天打开 http://acm.whu.edu.cn/woj 检查oak的运行情况
发现在status的第二页有好多个submit都处于Running状态
ssh到服务器上去看了一下,发现Judge在Compile OK以后就挂掉了。
有一堆Stack的信息,但是看不太懂~

DEBUG了一阵,定位到了错误:在判断Restricted_Function的那个函数里面。
加入了调试代码以后的大概结构是这样的:
......
bool Restricted_Function(){
    char f[30], ...;
    ......
    cout << "DEBUG 1" << endl;
    return false;
}

......

bool WOJ_JUDGE(){
    ......
    cout << "DEBUG 0“ << endl;
    if(Restricted_Function(){
        cout << "DEBUG 2" << endl;
        return RF;
    }
    cout << "DEBUG 2" << endl;
    ......
}

然后发现非常神奇地,程序输出的是
引用
DEBUG 0
DEBUG 1
然后跟上一堆程序出现错误的信息。
于是我就懵了,居然一个return语句也能出现错误?

然后请教snoopy大牛,经过一番七荤八素的DEBUG以后,终于找到了症结所在:
原来在Restricted_Function里面定义的那个char f[30]空间太小了
由于是分配在栈空间里面的,所以在运行的时候,出现了少量越界写入的情况
在程序返回的时候,由于返回地址等被未预料到的字符覆盖了,于是就出现了上述问题。

一个return语句也能"出错",暴露出这样严重的内存使用问题
——可能存在于任何地方,写程序的时候务必要小心啊!

同时,通过这种方式"定位"到的错误点,未必就是错误真正发生的地方!
Dec 29

MySQL的事务功能 不指定

felix021 @ 2008-12-29 18:06 [IT » 数据库] 评论(0) , 引用(0) , 阅读(6427) | Via 本站原创
据说MySQL是从v4.0开始支持事务(Transaction)的,一直没去试过。
今天心血来潮,于是就玩了一下。

首先,mysql里面有一个状态量叫做 autocommit ,默认值是1
也就是说,当你提交一个SQL语句以后,这条语句会被立即执行并修改数据库内容(如果有必要的话)。

所以如果你想要开始一个事务,那么首先应该把这个东东设置为0,有这么几种方法:
  1. 提交SQL语句 START TRANSACTION;
  2. 提交SQL语句 BEGIN;
  3. 提交SQL语句 SET AUTOCOMMIT=0;
  4. (PHP) mysqli_autocommit($conn, false);

然后就可以开始进行你想做的数据库修改了,比如INSERT, UPDATE, DELETE

修改完以后,如果返回的结果有不对劲的地方,OK,试试
  1. 提交SQL语句 ROLLBACK;
  2. 或者(PHP) mysqli_rollback($conn);
然后你就会发现数据库好像根本没有操作过似的
(其实仔细观察的话会发现auto_increment那个字段的max值变大了-____-)

如果一切OK,那么就用这个:
  1. 提交SQL语句 COMIIT;
  2. 或者(PHP) mysqli_commit($conn);
注意,在提交COMMIT以后,数据库的改动就正式写到硬盘,不能撤销啦。

给俩例子吧:

a. 在MySQL命令行下进行的操作
mysql> use t;
mysql> CREATE TABLE `test`(`id` int primary key auto_increment, `name` char(50));
mysql> START TRANSACTION;
mysql> INSERT INTO `test` VALUES (NULL, 'a');
mysql> COMMIT;   #或者  mysql> ROLLBACK;
mysql> SELECT * FROM `test`;
看看效果如何?

OK,再来个PHP版本的:
<?php

$conn = new mysqli("localhost", "root", "123456", "t");

$conn->autocommit(false);

$res = $conn->query("INSERT INTO `test` VALUES(NULL, 'a')");

if($res)
    $conn->commit();
else
    $conn->rollback();

$conn->close();
?>
Dec 29

活在两个数字的世界里 不指定

felix021 @ 2008-12-29 10:59 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(5907) | Via 本站原创
#include<iostream>
using namespace std;

char l[] = "Felix021";

void print(char a){
    for(int i = 7; i >= 0; --i){
        cout << ((a >> i ) & 1);
    }
}

int main(){
    for(int i = 0; l[i]; ++i){
        print(l[i]);
    }
    cout << endl;
    return 0;
}
Dec 27

Javascript onblur事件 不指定

felix021 @ 2008-12-27 11:38 [IT » 网络] 评论(0) , 引用(0) , 阅读(5713) | Via 本站原创
修改模板的时候希望能在 搜索框 实现这样一种效果:
默认显示内容为Search... ;鼠标点击激活后自动清空; 失去焦点以后如果内容为空,重置为Search...

记得IE有个onFocusOut事件,试了一下,确实OK
但是,非常遗憾地,FireFox没有这个事件。
又是Google又是Baidu,然后发现自己犯了Shability:
原来还有一个onBlur事件,就是用来作这件事情的。
<input type="text" value="Search..." onfocus="if(this.value=='Search...')this.value='';" onblur="if(this.value=='')this.value='Search...';"/>
Dec 23
发现听到这些语句的频率越来越高,而且我总是不能马上反应过来
每次都以为现在病毒事业蒸蒸日上,已经大规模入侵手机操作系统了呢

然后一听描述就是
哎呀,有个autorun.inf
哎呀,打不开了手机了,弹出“打开方式”对话框
哎呀,文件找不到了,但是空间显示还是那么多

汗ing...

解决办法:

资源管理器 -> "工具"菜单 -> "文件夹选项..." -> "查看"选项卡 ->
去掉 "隐藏受保护的操作系统文件(推荐)"前面的勾勾
然后下面选择 "显示所有隐藏文件和文件夹"
点击确定,然后看看文件出来没?

打开命令提示符: 开始->运行->输入 cmd 回车
然后应该会看到一个黑黑的窗口,光标闪动。
看看你的手机/MP3分配到了哪个盘,比如说是F
输入 F:  (有个冒号),然后回车
然后输入 dir /a 回车
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\ooxx>F:

F:\>dir /a
驱动器 F 中的卷是 Nokia ooxx
卷的序列号是 1234-5678

F:\ 的目录

2003-01-01  00:00    <DIR>          Music
2008-12-23  10:44    <DIR>          Photos
2008-12-23  10:44    <DIR>          视频
               0 个文件              0 字节
               2 个目录  1,060,593,664 可用字节

看到最后一列了不?就是你手机/MP3上的所有文件吧
依次输入
引用
attrib -s -r -h 文件名

然后再看看MP3,文件是不是出来了?
Dec 21

更换Blog模板 oh yeah! 不指定

felix021 @ 2008-12-21 05:41 [IT » 其他] 评论(3) , 引用(0) , 阅读(6417) | Via 本站原创
把bo-blog搭建到了whuacm的服务器上
但是不想让首页看起来让人觉得陌生
于是花了几个小时,以whuacm主页的css为参照
把原先那个模板的css乱改一通
然后就变成这样了
看起来很简洁的吧?
于是自己也换上^_^

提供下载吧(才83K),更新版,修正了一些错误,更漂亮了点儿~
下载文件 (已下载 1384 次)
分页: 57/103 第一页 上页 52 53 54 55 56 57 58 59 60 61 下页 最后页 [ 显示模式: 摘要 | 列表 ]