标签: c++03

C++(不是C++ 11)在非常大的方法中发布数组的最佳方法

我必须使用许多可能的执行流修改一个非常大的方法.修改涉及使用在堆中分配char数组new.我想确保正确释放此数组,但我想避免delete[]在所有可能的执行流程中执行此操作.另外,我想为此目的做一些"更清洁"的事情,以避免未来的错误.

我曾考虑过分配数组,new然后将其包装到本地std::vector(但保留对原始指针的引用,因为该方法密集使用此引用)并让包装器在超出范围时删除原始指针.

我在这里附上一个例子.此示例的目的是显示使用原始指针执行的操作类型.

char *rawPtr = new char[1024];
std::vector wrapper(rawPtr, rawPtr + 1024); // <= Does it assure that rawPtr will be released properly?
...
for(int i = 0; i < 1024; i++)
    rawPtr[i] = ...;

rawPtr += sizeof(...);
...
rawPtr -= ...;
if(...)
    return ...;

return ...;
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,如果我能确定rawPtr无论程序失败,异常,传入return语句等都能正确发布.

PD.:我不能使用C++11,我对智能指针最相似的是auto_ptr这个用delete,而不是delete[].

c++ arrays pointers c++03 c++98

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

如何避免 clang-format 将两个单独的“&gt;”格式化为一个班次?

当我使用 clang 来格式化我的 C++ 代码时,我遇到了一个问题:

priority_queue<int, vector<int>, greater<int> > q;
Run Code Online (Sandbox Code Playgroud)

将自动格式化为:

priority_queue<int, vector<int>, greater<int>> q;
Run Code Online (Sandbox Code Playgroud)

两个单独的 '>' 将被格式化为一个移位 >>。

那么我应该如何配置.clang-format文件来避免这种情况呢?

c++ c++03 clang-format

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

未检测到使用 -std=c++03 编译

我将这个简单的代码编译为 g++ main.cpp -o main -std=c++03

#include <vector>
int main(){
    std::vector<int> array;
    std::vector<int> array2 = { 9, 7, 5, 3, 1 };
}
Run Code Online (Sandbox Code Playgroud)

我收到以下编译错误:

main.cpp: 在函数 'int main()':
main.cpp:39:18: 错误:在 C++98 中,'array2' 必须由构造函数初始化,而不是由 '{...}'
std::vector数组 2 = { 9, 7, 5, 3, 1 };
                  ^~~~~~
main.cpp:39:43: 错误:无法将 '{9, 7, 5, 3, 1}' 从 '' 转换为 'std::vector'
std::vector array2 = { 9 , 7, 5, 3, 1 };

似乎即使我正在使用-std=c++03(初始化列表可用的地方)进行编译,但我仍在使用 C++98 标准。为什么会这样?

我知道此代码将使用更新的标准进行编译。

c++ c++-standard-library c++03

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

创建对象时是否初始化了类中的成员值?

我正在写一个哈希类:

struct hashmap {
  void insert(const char* key, const char* value);
  char* search(const char* key);
 private:
  unsigned int hash(const char* s);
  hashnode* table_[SIZE]; // <--
};
Run Code Online (Sandbox Code Playgroud)

因为insert()需要在插入新对时检查table [i]是否为空,所以我需要在启动时将表中的所有指针设置为NULL.

我的问题是,这个指针数组table_会自动初始化为零,还是我应该手动使用循环在构造函数中将数组设置为零?

c++ initialization member c++03

0
推荐指数
1
解决办法
1336
查看次数

为什么std :: map没有提供key_iterator和value_iterator?

我在C++ 03环境中工作,并将一个函数应用于地图的每个键是很多代码:

const std::map<X,Y>::const_iterator end = m_map.end();
for (std::map<X,Y>::const_iterator element = m_map.begin(); element != end; ++element)
{
   func( element->first );
}
Run Code Online (Sandbox Code Playgroud)

如果key_iterator存在,相同的代码可以利用std::for_each:

std::for_each( m_map.key_begin(), m_map.key_end(), &func );
Run Code Online (Sandbox Code Playgroud)

那为什么不提供呢?有没有办法让第一种模式适应第二种模式?

c++ iterator stdmap standard-library c++03

0
推荐指数
1
解决办法
316
查看次数

如何有效地确定整数的汉明权重是否恰好是1?

给定C++ 03中的32位或64位整数,确定是否只有一位设置的有效方法是什么?(例如,值正好是1,2,4,8,16,32等中的一个)C++ 03库(或者如果不是C++ 11)是否有任何内置函数可以在我遇到的任何硬件上高效工作在吗?我想将它用于在多次出现时频繁发生的衰减消息.

c++ integer hammingweight c++03

0
推荐指数
1
解决办法
101
查看次数

将类A的reinterpret_cast向量转换为类B的向量

说我有两个班A,并B和阶级的载体A如下:

class A {
    int foo;
    int bar;
    void someMethod();
};
class B {
    uint foo;
    uint bar;
    void someOtherMethod();
};
std::vector<A>  va;
Run Code Online (Sandbox Code Playgroud)

并且我想将其解释va为B的向量,因为int并且uint可以重新解释.

重新解释的最佳做法是什么?例如,如果我想要调用someOtherMethod()va,我能做到((std::vector<B> *)(&va))->someOtherMethod().但这是最好的做法吗?

在我看来,这reinterpret_cast<std::vector<B> >(va).someOtherMethod()不起作用.

另外,我正在研究C++ 03.

- 更新 -

很抱歉我误解了自己的问题.然而,我的问题与这个问题有很大的不同.所以我创造了另一个问题在这里.

我将很快结束这个问题:这个问题可以看作是一个独立的问题,我认为下面的答案之一已经足够被接受了.

c++ c++03

0
推荐指数
1
解决办法
1139
查看次数

我可以使用C++ 03标准库功能模拟空lambda吗?

我坚持GCC 4.4,所以尽管介绍-std=c++0x我的代码库没有使用lambdas.

是否有一个C++ 03相当于一个空的lambda [](){},我可以安全地使用它作为某种类型的泛型参数的默认参数Callback

我问,因为旧的std::plus,std::less等了方便,但我似乎无法找到一个空操作,void-returning等同.

c++ c++03

0
推荐指数
1
解决办法
516
查看次数

c ++(不是> = 11),初始化地图中的嵌套对

在我不应该用-std = c ++ 11编译的限制下,我想在以下变量中添加一个额外的变量,

std::map<unsigned,
  std::map<unsigned,
    std::pair<
      std::pair<int, int>,
      std::pair<bool, bool>
    >
  >
>
temp;
Run Code Online (Sandbox Code Playgroud)

并据此调整其初始化:

for (int i=0; i<100; ++i)
  {
    temp[i][i]=
      std::pair<
        std::pair<int, int>,
        std::pair<bool, bool>
        >
      > (
          std::pair<int, int> (intsX[i], intsY[i]),
          std::pair<bool, bool> (boolsX[i], boolsY[i])
        );
  }
Run Code Online (Sandbox Code Playgroud)

我想将结构更改为:

std::map<unsigned,
  std::map<unsigned,
    std::pair<
      std::pair<int, int>,
      std::pair<
        std::pair<bool, bool>,
        double
      >
    >
  >
>
temp;
Run Code Online (Sandbox Code Playgroud)

现在,我不知道如何更改初始化,例如......

for (int i=0; i<100; ++i)
  {
    temp[i][i]=
      std::pair<
        std::pair<int, int>,
        std::pair<
          std::pair<bool, bool>,
          double
        >
      > (
          std::pair<int, int> (intsX[i], intsY[i]),
          std::pair<std::pair, …
Run Code Online (Sandbox Code Playgroud)

c++ stdmap c++03 std-pair

0
推荐指数
1
解决办法
144
查看次数

cout一个字符串流但打印一个指针

这是我的代码:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

class TestLog: public std::stringstream
{
        public:
                ~TestLog()
                {
                        cout << (str()) << endl; // Why does this print an address ?
                }
};

int main()
{
        TestLog() << "Hello World!"; //test 1 print an address
        stringstream ss;
        ss << "Hello World!";
        cout << (ss.str()) << endl; //test 2 print a string

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

并输出:

0x401b90

你好,世界!

编译器信息:

g ++(GCC)4.8.5 20150623(Red Hat 4.8.5-11)

在我看来,(a)std :: stringstream的str()方法返回一个字符串.(b)std :: cout是std :: ostream的对象.因此,两个测试都将调用ostream的相同运算符函数并打印相同的"Hello …

c++ c++03

0
推荐指数
1
解决办法
562
查看次数