C++Primer第18.1.2节在介绍allocator类的时候,给了一个仿照标准库中vector的例子。感觉示例代码非常好,但是本人发现了一个bug,与大家共享。

按照作者的示例程序,编译程序时总是在alloc.construct()函数处报错,不同IDE可能提示的错误原因不同,本人的是undefined reference to `Vector<std::string>::alloc'。

仔细想想,应该与类Vector中alloc成员的静态属性有关,因此有两种修正方式:

 1)删去static关键字

 2)在全局作用域添加:template<class T> std::allocator<T> Vector<T>::alloc;

测试源代码如下:

 #include <iostream>
#include <string>
#include <memory>
using namespace std; std::ptrdiff_t max(std::ptrdiff_t a, std::ptrdiff_t b)
{
return a > b ? a : b;
} template <class T> class Vector{
public:
Vector(): elements(), first_free(), end() {}
void push_back(const T&); private:
static std::allocator<T> alloc;
void reallocate();
public:
T * elements;
T * first_free;
T * end;
}; template<class T> std::allocator<T> Vector<T>::alloc;//如果没有这句,编译器报错,但如果类Vector中去掉static关键字,这句可以删掉 template <class T>
void Vector<T>::push_back(const T& t)
{
if(first_free == end)
reallocate();
alloc.construct(first_free,t);
++first_free;
} template <class T>
void Vector<T>::reallocate()
{
std::ptrdiff_t size = first_free - elements;
std::ptrdiff_t newcapacity = * max(size, ); T * newelements = alloc.allocate(newcapacity); uninitialized_copy(elements, first_free, newelements); for(T * p = first_free; p != elements; alloc.destroy(--p)); if(elements)
alloc.deallocate(elements, end - elements); elements = newelements;
first_free = elements + size;
end = elements + newcapacity;
} int main()
{
Vector<string> str;
string s;
for(int i = ; i < ; ++i)
{
cin>>s;
str.push_back(s);
}
for(string * p = str.elements; p != str.first_free; ++p)
cout<<*p<<endl;
return ;
}

虽然知道了解决办法,但是对于bug的原因并不是很清楚,欢迎大家留言交流及指教。

C++ Primer第18章Vector的再实现及bug修正的更多相关文章

  1. 第18章 集合框架(2)-Set接口

    第18章 集合框架(2)-Set接口 Set是Collection子接口,模拟了数学上的集的概念 Set集合存储特点 1.不允许元素重复 2.不会记录元素的先后添加顺序 Set只包含从Collecti ...

  2. 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  3. 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  4. 【C#4.0图解教程】笔记(第9章~第18章)

    第9章 语句 1.标签语句 ①.标签语句由一个标识符后面跟着一个冒号再跟着一条语句组成 ②.标签语句的执行完全如同标签不存在一样,并仅执行冒号后的语句. ③.给语句添加一个标签允许控制从代码的另一部分 ...

  5. 从新手到高手c++全方位学习 pdf + 视频教程 共18章

    淘宝已经和谐了这个网站,原网址:https://item.taobao.com/item.htm?spm=a1z09.8149145.0.0.mb00D0&id=17350311256& ...

  6. C#高级编程9 第18章 部署

    C#高级编程9 第18章 部署 使用 XCopy 进行部署 本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序. 1.将项目中生成的程序集复制到目标计算机,生成的程序集位于项 ...

  7. MySQL性能调优与架构设计——第 18 章 高可用设计之 MySQL 监控

    第 18 章 高可用设计之 MySQL 监控 前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一 ...

  8. C++ Primer 第3章 字符串、向量和数组

    C++ Primer 第3章 字符串.向量和数组 C Primer 第3章 字符串向量和数组 1 命名空间的using声明 2 标准库类型string 3 标准库类型vector 4 迭代器介绍 5 ...

  9. 第18章:MYSQL分区

    第18章:分区 目录 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. KEY分区 ...

随机推荐

  1. [?]Unity快捷键

    Super=Win键. Rererence: What are Unity's keyboard and mouse shortcuts?

  2. Ajax 用法, 实现方法,JS原生与JQ实现

    AJAX 详解 ajax是实现页面异步加载. 常用于, 前后端数据交互, 实现前端页面无刷新更改操作. 是web前端和后端使用者开发的必备使用技能~~ Ajax操作~   :  俗话原理 : 用俗话来 ...

  3. YUM更换源--yum找不到安装包(转)

    公司提供的CentOS VM中,/etc/yum.repos.d 下 只有一个build.repo,其中提供的yum 源只有公司内部的几个源,很多包在这些源中都找不到.于是要添加别的源,下面的帖子中介 ...

  4. python super研究

    # encoding=utf-8 class A(object): def __init__(self): print "初始化a" def run(self): print &q ...

  5. [XMPP]简易的聊天室实现[一]

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  6. C# Chart 折线图 多条数据展示

    private void btn_Click(object sender, EventArgs e) { DBHelper db = new DBHelper(); DataSet ds = db.G ...

  7. GDAL的RASTERIO功能

             为了能快速的显示大影像,最近一直在学习GDAL,GDAL确实是一个功能强大的开源库,其核心部分数据集和波段,下面这个图很详细的描述了它们之间的关系,还有其中的细节:     GDAL ...

  8. LoadRunner Tutorial

    LoadRunner Tutorial Welcome to the LoadRunner tutorial. The tutorial is a self-paced guide that lead ...

  9. grok 正则解析日志例子<1>

    <pre name="code" class="html">下面是日志的样子 55.3.244.1 GET /index.html 15824 0. ...

  10. 必学100个常用linux命令大全

    1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部 2 ...