【问题标题】:Processing a queue of arrays处理数组队列
【发布时间】:2012-09-20 20:15:08
【问题描述】:
#ifndef UNICODE
#define UNICODE
#endif

#include <iostream>
#include <Windows.h>
#include <queue>

using namespace std;

void addSomeContent(queue<TCHAR*> &s)
{
    static int counter=0;
    TCHAR buffer[30];

    wsprintf(buffer,TEXT("foo%d"),counter);

    s.push(buffer);
    counter++;

    if(counter < 10)
    addSomeContent(s);
}


int main (void)
{
    queue<TCHAR*> strings; 

    addSomeContent(strings);

    while(!strings.empty()) 
    {   
        wcout<<strings.front()<<endl;
        strings.pop();
    }

    system("pause");
    return (0);
}

输出:

foo0

期望:

foo0
foo1
.
.
.
foo9

我哪里错了?

【问题讨论】:

标签: c++ stl queue std


【解决方案1】:

原因是您的buffer 是堆栈上的本地变量。一旦你离开这个功能,它就会过期。

如果您真的想这样做,请在堆 TCHAR *buffer = new TCHAR[30]; 上创建它。之后您可能需要delete[] 它。

但是,我认为使用一些内置类型或 stl 容器而不是操作指针将使您的代码更具可读性和可管理性。

【讨论】:

    【解决方案2】:

    当你这样做时

    s.push(buffer);
    

    您将指向buffer 的指针多次添加到队列中(在最好的情况下,您将获得最后一个字符串的相同副本),但是一旦到达addSomeContent 的末尾,该指针将无效(给您如果不是分段违规,则为随机内容)。您应该将字符串的副本添加到队列中。

    【讨论】:

    • '计数器永远不会增加,只需要一个字符串'。你确定吗?
    • '您应该将字符串的副本添加到队列中。' - 如何实施? s.push(*buffer); 不起作用。
    • 如果您真的必须使用指向字符的指针,请使用 strdup 可能与 filipenf 建议的 auto_ptrshared_ptr 结合使用。但是,如果您使用 std::string,这一切都是在幕后为您完成的。
    • 我同意 Andre,最好的选择是使用 std::string 并在需要时对 TCHAR 进行强制转换。
    【解决方案3】:

    问题是 TCHAR 指针在堆栈中。为了将指针传递出函数,您应该在堆中分配它(使用 new )。

    但是你为什么使用 TCHAR 而不是 std::string?

    【讨论】:

    • 我使用 TCHAR 是因为它与 Windows API 更加“无缝”。
    • 所以你应该使用 xvatar 的建议,使用 new TCHAR[...] 分配它。但是你必须在使用队列后删除它,或者你必须将它包装在 std::auto_ptr 或类似的东西中......或者......你使用 std::string :-)跨度>
    • std::auto_ptr - 我从未听说过这个实用程序。谢谢,这将非常有用。
    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多