std::queue에서 push가 exception이 발생 하나요?

ehaakdl의 이미지

문서를 보고 파악하려고 하는데 배경이 부족하여 도움을 요청합니다.
이게 exception 발생 한다는 애기인지 뭘 보장 한다는건지 의미를 좀 알려주시면 감사 하겠습니다.
Exception safety
Provides the same level of guarantees as the operation performed on the underlying container object.

익명 사용자의 이미지

1. 어디서 가져온 어떤 텍스트의 일부인지 밝혀 주셔야지, 한 줄만 달랑 들고오면 어쩝니까

2. 제시된 문장은 문자 그대로 underlying container object에 수행된 operation과 같은 수준의 보장을 한다는 겁니다.

3. 이런 식으로 되어 있는 이유는 queue가 container가 아니라 container adapter이기 때문입니다. queue template은 데이터를 저장하는 스토리지를 직접 구현하지 않고, 다른 컨테이너 (underlying container)를 템플릿 매개변수로 지정 받아 사용합니다. 디폴트로는 std::deque를 사용하지요.

https://en.cppreference.com/w/cpp/container/queue

queue::push는 queue의 underlying container object c에 대해 c.push_back을 호출하게 되어 있습니다.

https://en.cppreference.com/w/cpp/container/queue/push

결국 정리하면, 디폴트 queue 객체에 대해서 queue::push의 exception safety는 deque::push_back의 보장과 같다는 거죠.

그리고 deque::push_back의 exception safety는 strong exception guarantee입니다.

https://en.cppreference.com/w/cpp/container/deque/push_back

4. 뭐, 그런 게 중요하다기보다는...

위 deque::push_back의 exceptions 단락을 보시면 아시겠지만, 대충 귀하의 문제는 Allocator::allocate가 예외를 발생시키거나, 원소의 복사/이동 생성/할당이 예외를 발생시키는 경우인 것으로 예상이 됩니다. 커스텀 할당자 같은 걸 쓰고 있는 게 아니라면 전자보다는 후자가 가능성이 더 높을텐데, 어쩌다 이런 문제가 일어났는지는 질문글만 봐서는 잘 모르겠네요.

익명 사용자의 이미지

아, queue::push에서 예외가 발생해서 문제를 겪고 있다는 게 아니라, 그런 경우가 있을 수 있느냐는 질문이었군요.

그럼 답은 "그럴 수 있다" 입니다. 이걸 "push가 발생시킨 예외"라고 부를 수 있는지는 미묘한 해석의 문제로군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.