小编Fab*_*ian的帖子

我可以使std :: string使用更少的内存吗?

在开始之前,我需要声明我的应用程序使用了很多字符串,这些字符串平均很小,并且一旦创建就不会更改.

在Visual Studio 2010中,我注意到std :: string的容量至少为30.即使我写std::string str = "test";了,str的容量也是30. str.shrink_to_fit()尽管std ::存在一个具有相同名称的函数,但该函数对此没有任何作用.矢量和按预期工作,即减少容量,使容量==大小.

  1. 为什么不按std::string::shrink_to_fit()预期工作?
  2. 如何确保字符串分配最少的内存?

c++ memory string visual-studio-2010

7
推荐指数
1
解决办法
1216
查看次数

如何检查 SQLite3 数据库是否在 Python 中连接?

问题 1:我在 Python 中有一个 SQLite3 连接。如何检查它是否已连接?我知道如果 sqlite3.connect() 失败,则会引发异常,但是如果我或某些人关闭了连接,我该如何检查并在必要时重新打开它?

问题 2:我可以在连接打开时移动文件系统中的文件(无法删除)。无论出于何种原因,数据库随后变为只读。如果我把它移回去,它就好像什么都没发生一样。有人可以解释一下吗?我应该在访问前检查 isfile(dbpath) 吗?

python sqlite

7
推荐指数
2
解决办法
1万
查看次数

如何让Visual Studio 2010警告未使用的变量?

#include <string>

using namespace std;

int main()
{
    string s; // no warning
    int i;    // warning C4101

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么Visual Studio会警告我未使用的变量,is示例中没有?
  2. 我假设编译器不确定字符串构造函数的副作用.这是不显示警告的原因吗?
  3. 我能以某种方式启用有关未使用的字符串变量的警告?

我的警告级别设置为4.

c++ stdstring visual-studio-2010 compiler-warnings

6
推荐指数
1
解决办法
1062
查看次数

为什么当我单击控制台上的关闭按钮时没有调用析构函数?

我在 Windows 7 上有一个命令行应用程序。它主要由一个无限循环组成。当我单击命令行控制台窗口的关闭按钮时,它似乎立即被杀死。但是,我在析构函数中关闭了 SQLite 数据库连接,因此我担心数据库可能会损坏。即使没有,我也希望能够正确终止我的对象(也许通过向文件写入内容、记录日志等)。

我可以以某种方式确保调用我的析构函数吗?如果我关闭窗口到底会发生什么?有没有一种“更软”的方式来关闭程序?

c++ destructor terminate windows-7

5
推荐指数
1
解决办法
2153
查看次数

绑定参数如何在 SQLite3 中工作(以最小的例子为例)?

有人建议在 SQLite 中使用参数绑定来加速重复查询。但是,如果我有多个用于绑定的参数,则它不起作用。我没有看到我的错误。所有 SQLite 函数都返回 SQLITE_OK...

下面,我写了一个最小的例子。它创建一个表,创建三个条目,然后查询两次,一次使用一个绑定参数,一次使用两个。第一次返回一个结果,这是正确的。第二个返回零结果,而 sqlite3_step() 返回 101 (SQLITE_DONE)。为什么它也不返回一个结果?

#include <vector>
#include <sqlite3.h>

int main(int argc, char * argv[])
{
  sqlite3 * pDB;
  int iReturn = sqlite3_open("./Test.db", &pDB);
  if (iReturn != SQLITE_OK) {
    return 1;
  }

  // create table
  {
    std::string str = "CREATE TABLE Names(ID INTEGER PRIMARY KEY, Name VARCHAR(30))";
    iReturn = sqlite3_exec(pDB, str.c_str(), NULL, NULL, NULL);
    if (iReturn != SQLITE_OK) {
      sqlite3_close(pDB);
      return 1;
    }
  }

  // insert data using binding
  {
    std::string str = "INSERT …
Run Code Online (Sandbox Code Playgroud)

c++ sqlite

5
推荐指数
1
解决办法
1万
查看次数

是否有示例布局可以使 doxygen 文档更具吸引力?

我真的很惊讶 doxygen 文档的样子,例如KDE

我很想在我自己的包中使用类似的风格。谁能告诉我如何配置 doxygen 以使我的文档看起来更好?我假设这一切都可以使用来完成,但我想知道是否有一些示例样式表和布局 xml 文件可以在任何地方使用。我没有找到。

layout doxygen

5
推荐指数
1
解决办法
5327
查看次数

使用变量获取STL容器的size_type

我想以简单的方式编写基于索引的 for 循环。由于我的代码必须在 32 位和 64 位中运行,因此我收到很多有关隐式转换的警告,因为我通常使用 32 位整数,但 STL 在 64 位中使用 64 位整数。

std::vector<MyClass> c;
for (FOO ui = 0, uiEnd = c.size(); ui < uiEnd; ++ui){...}
Run Code Online (Sandbox Code Playgroud)
  • FOO = unsigned int在 32 位上工作,但在 64 位上生成警告。
  • FOO = size_t适用于 32 和 64 位,但并不完全正确,因为标准不要求std::vector<MyClass>::size_type == size_t.
  • FOO = auto不起作用(这是非常不幸的),因为它单独设置每个变量的类型,因此文字 0 (或 0UL 或其他)的类型不同于 c.size() (在 32 位或 64 位中, c.size() 可能不同,所以我无法写出正确的文字)。
  • for (auto uiEnd = c.size(), ui = 0*uiEnd; ui < uiEnd; ++ui){...}其工作原理是用正确的类型表达 0,但比较晦涩。 …

c++ loops auto

5
推荐指数
1
解决办法
378
查看次数

STL 是否为其标头指定了标头保护?

我想std::string在我的头文件中提供一些使用的内联便利函数以及使用的库函数const char *,但我不想包含<string>. #ifdef如果<string>是这种情况,我想检查是否包含并提供便利功能。

问题:对于所有 STL 实现,STL 标头中标头保护的名称是否相同?在 Visual Studio 2010 中,头文件保护<string>_STRING_.

c++ stl include-guards

4
推荐指数
1
解决办法
160
查看次数

就 ABI 兼容性而言,静态库的行为是否与动态库类似?

我了解到,您不能一起使用由不同编译器编译的共享库,因为它们的 ABI 通常不兼容。当然例外的是如果你有一个纯C 接口,那么这是可能的。但是,我在这方面没有找到关于静态库的明确说明,因此提出这个问题。

我的问题是静态库是否有同样的问题。如果我的共享库链接到来自不同编译器的静态库,它会在运行时按预期进行编译和工作吗?或者它会编译并表现得很糟糕吗?或者它永远不会编译?

c++ abi static-libraries

4
推荐指数
1
解决办法
751
查看次数

我可以使用 std::vector::insert 将向量插入自身吗?

C++03 标准是否允许将 a 附加std::vector到自身?v我想知道如果需要重新分配内存,源迭代器是否会变得无效。在我的 STL 实现中,旧内存会一直保留,直到创建新内存为止。但我可以依靠这个吗?如果不是,v.reserve(2 * v.size())在插入之前是否是完全避免重新分配的良好解决方案?

vector<int> v;
v.reserve(3);
v.push_back(1);
v.push_back(2);
v.push_back(3);
// v may need to reallocate because its capacity may be less than 6.
// Is this operation safe?
v.insert(v.end(), v.cbegin(), v.cend());
Run Code Online (Sandbox Code Playgroud)

或者

// Here v will _not_ need to reallocate because it has enough capacity.
// Is this operation safe?
v.reserve(2 * v.size());
v.insert(v.end(), v.cbegin(), v.cend());
Run Code Online (Sandbox Code Playgroud)

c++ stdvector c++03

3
推荐指数
1
解决办法
323
查看次数